ignitefuse 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +37 -0
- package/THIRD_PARTY_NOTICES.md +37 -0
- package/dist/index.js +9954 -0
- package/dist/index.js.map +7 -0
- package/package.json +51 -0
- package/skills/ignitefuse/SKILL.md +75 -0
- package/skills/ignitefuse/references/full-api-and-architecture.md +93 -0
- package/skills/ignitefuse-dev/SKILL.md +22 -0
- package/skills/ignitefuse-dev/references/implementation-map.md +18 -0
- package/skills/ignitefuse-dev/references/task-recipes.md +32 -0
- package/skills/ignitefuse-make-toolpath/SKILL.md +48 -0
- package/skills/ignitefuse-make-toolpath/references/api-shape.md +211 -0
- package/skills/ignitefuse-make-toolpath/references/direct-open-case-solid-bottom.md +193 -0
- package/skills/ignitefuse-make-toolpath/references/direct-region-fill.md +34 -0
- package/skills/ignitefuse-make-toolpath/references/function-implementation.md +137 -0
- package/skills/ignitefuse-make-toolpath/references/stl-standard-fdm.md +50 -0
- package/skills/ignitefuse-params/SKILL.md +24 -0
- package/skills/ignitefuse-params/references/param-patterns.md +153 -0
- package/skills/ignitefuse-printer-scene/SKILL.md +26 -0
- package/skills/ignitefuse-printer-scene/references/canonical-printer-scene.md +110 -0
- package/skills/ignitefuse-studio-mcp/SKILL.md +29 -0
- package/skills/ignitefuse-studio-mcp/references/mcp-tools.md +205 -0
- package/web/_app/env.js +1 -0
- package/web/_app/immutable/assets/0.7gMbBLNl.css +1 -0
- package/web/_app/immutable/assets/2.DUefECe3.css +1 -0
- package/web/_app/immutable/chunks/BLxuUouR.js +1 -0
- package/web/_app/immutable/chunks/BYlkGUYK.js +2 -0
- package/web/_app/immutable/chunks/ByZS5AaA.js +1 -0
- package/web/_app/immutable/chunks/C8-ejoe7.js +1 -0
- package/web/_app/immutable/chunks/CH8BOpuN.js +1 -0
- package/web/_app/immutable/chunks/Crm9Js9u.js +1 -0
- package/web/_app/immutable/chunks/D2Rdy9P1.js +1 -0
- package/web/_app/immutable/chunks/DwxNakxI.js +1 -0
- package/web/_app/immutable/entry/app.CUixVVde.js +2 -0
- package/web/_app/immutable/entry/start.DLVy4bB7.js +1 -0
- package/web/_app/immutable/nodes/0.Dgd1b1QE.js +1 -0
- package/web/_app/immutable/nodes/1.D_VGAzop.js +1 -0
- package/web/_app/immutable/nodes/2.CajHQkWG.js +5344 -0
- package/web/_app/immutable/workers/assets/clipper2z-bvMLVKp3.wasm +0 -0
- package/web/_app/immutable/workers/fuseRuntime.worker-DXbd4CFC.js +22 -0
- package/web/_app/immutable/workers/layerToolpath.worker-5A0bN0Cv.js +15 -0
- package/web/_app/immutable/workers/sectionConnect.worker-D4w8efrj.js +1 -0
- package/web/_app/version.json +1 -0
- package/web/favicon.png +0 -0
- package/web/icon.png +0 -0
- package/web/index.html +43 -0
- package/web/logo.png +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/.pnpm/clipper2-wasm@0.2.1/node_modules/clipper2-wasm/dist/umd/clipper2z.js", "../src/index.ts", "../../../packages/presets/src/filaments/abs.json", "../../../packages/presets/src/filaments/asa.json", "../../../packages/presets/src/filaments/petg.json", "../../../packages/presets/src/filaments/pla.json", "../../../packages/presets/src/filaments/tpu.json", "../../../packages/presets/src/printers/base-fdm.json", "../../../packages/presets/src/printers/base-bambu-fdm.json", "../../../packages/presets/src/printers/base-klipper-fdm.json", "../../../packages/presets/src/printers/base-marlin-fdm.json", "../../../packages/presets/src/printers/base-prusa-fdm.json", "../../../packages/presets/src/printers/bambu-a1-mini.json", "../../../packages/presets/src/printers/bambu-a1.json", "../../../packages/presets/src/printers/bambu-p1s.json", "../../../packages/presets/src/printers/bambu-x1c.json", "../../../packages/presets/src/printers/generic-klipper.json", "../../../packages/presets/src/printers/generic-marlin.json", "../../../packages/presets/src/printers/prusa-mk4.json", "../../../packages/presets/src/index.ts", "../../../packages/project/src/index.ts", "../../../packages/runtime/src/gcode/editor.ts", "../../../packages/runtime/src/geometry/vector.ts", "../../../packages/runtime/src/toolpath/coordinates.ts", "../../../packages/runtime/src/gcode/exporter.ts", "../../../packages/runtime/src/geometry/kernel/clipper.ts", "../../../packages/runtime/src/geometry/kernel/cleanup.ts", "../../../packages/runtime/src/geometry/kernel/intersections.ts", "../../../packages/runtime/src/geometry/kernel/offset.ts", "../../../packages/runtime/src/geometry/kernel/classify.ts", "../../../packages/runtime/src/geometry/kernel/lineClip.ts", "../../../packages/runtime/src/geometry/kernel/validate.ts", "../../../packages/runtime/src/mesh/bounds.ts", "../../../packages/runtime/src/mesh/stl.ts", "../../../packages/runtime/src/mesh/transform.ts", "../../../packages/runtime/src/section/classify.ts", "../../../packages/runtime/src/section/defaults.ts", "../../../packages/runtime/src/section/connect.ts", "../../../packages/runtime/src/section/plane.ts", "../../../packages/runtime/src/section/region.ts", "../../../packages/runtime/src/mesh/topology.ts", "../../../packages/runtime/src/section/slice.ts", "../../../packages/runtime/src/toolpath/stats.ts", "../../../packages/runtime/src/geometry/kernel/boolean.ts", "../../../packages/runtime/src/toolpath/infill.ts", "../../../packages/runtime/src/toolpath/planning.ts", "../../../packages/runtime/src/toolpath/validate.ts", "../../../packages/runtime/src/toolpath/modifiers.ts", "../../../packages/runtime/src/toolpath/builder.ts", "../../../packages/runtime/src/toolpath/perimeters.ts", "../../../packages/runtime/src/runtime/layerWorkerPool.ts", "../../../packages/runtime/src/runtime/sectionWorkerPool.ts", "../../../packages/runtime/src/runtime/fuseScriptRuntime.ts", "../../../packages/runtime/src/toolpath/summary.ts"],
|
|
4
|
+
"sourcesContent": ["\nvar Clipper2ZFactory = (() => {\n var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;\n \n return (\nfunction(moduleArg = {}) {\n var moduleRtn;\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith(\"blob:\")){scriptDirectory=\"\"}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}{readAsync=url=>fetch(url,{credentials:\"same-origin\"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+\" : \"+response.url))})}}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];var wasmBinary=Module[\"wasmBinary\"];var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b);Module[\"HEAP64\"]=HEAP64=new BigInt64Array(b);Module[\"HEAPU64\"]=HEAPU64=new BigUint64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module[\"monitorRunDependencies\"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module[\"monitorRunDependencies\"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module[\"onAbort\"]?.(what);what=\"Aborted(\"+what+\")\";err(what);ABORT=true;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";var isDataURI=filename=>filename.startsWith(dataURIPrefix);function findWasmBinary(){var f=\"clipper2z.wasm\";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming==\"function\"&&!isDataURI(binaryFile)&&typeof fetch==\"function\"){return fetch(binaryFile,{credentials:\"same-origin\"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err(\"falling back to ArrayBuffer instantiation\");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports[\"t\"];updateMemoryViews();wasmTable=wasmExports[\"w\"];addOnInit(wasmExports[\"u\"]);removeRunDependency(\"wasm-instantiate\");return wasmExports}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){receiveInstance(result[\"instance\"])}var info=getWasmImports();if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}wasmBinaryFile??=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}class ExitStatus{name=\"ExitStatus\";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module[\"noExitRuntime\"]||true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var __abort_js=()=>abort(\"\");var embindRepr=v=>{if(v===null){return\"null\"}var t=typeof v;if(t===\"object\"||t===\"array\"||t===\"function\"){return v.toString()}else{return\"\"+v}};var embind_init_charCodes=()=>{var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes};var embind_charCodes;var readLatin1String=ptr=>{var ret=\"\";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret};var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var BindingError;var throwBindingError=message=>{throw new BindingError(message)};var InternalError;var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(type=>typeDependencies[type]=dependentTypes);function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError(\"Mismatched type converter count\")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((dt,i)=>{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type \"${name}\" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);var isUnsignedType=name.indexOf(\"u\")!=-1;if(isUnsignedType){maxRange=(1n<<64n)-1n}registerType(primitiveType,{name,fromWireType:value=>value,toWireType:function(destructors,value){if(typeof value!=\"bigint\"&&typeof value!=\"number\"){throw new TypeError(`Cannot convert \"${embindRepr(value)}\" to ${this.name}`)}if(typeof value==\"number\"){value=BigInt(value)}return value},argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null})};var GenericWireTypeSize=8;var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=readLatin1String(name);registerType(rawType,{name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},argPackAdvance:GenericWireTypeSize,readValueFromPointer:function(pointer){return this[\"fromWireType\"](HEAPU8[pointer])},destructorFunction:null})};var shallowCopyInternalPointer=o=>({count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType});var throwInstanceAlreadyDeleted=obj=>{function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+\" instance already deleted\")};var finalizationRegistry=false;var detachFinalizer=handle=>{};var runDestructor=$$=>{if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}};var releaseClassHandle=$$=>{$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}};var downcastPointer=(ptr,ptrClass,desiredClass)=>{if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)};var registeredPointers={};var registeredInstances={};var getBasestPointer=(class_,ptr)=>{if(ptr===undefined){throwBindingError(\"ptr should not be undefined\")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr};var getInheritedInstance=(class_,ptr)=>{ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]};var makeClassHandle=(prototype,record)=>{if(!record.ptrType||!record.ptr){throwInternalError(\"makeClassHandle requires ptr and ptrType\")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError(\"Both smartPtrType and smartPtr must be specified\")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record,writable:true}}))};function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance[\"clone\"]()}else{var rv=registeredInstance[\"clone\"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}var attachFinalizer=handle=>{if(\"undefined\"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)};var deletionQueue=[];var flushPendingDeletes=()=>{while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj[\"delete\"]()}};var delayFunction;var init_ClassHandle=()=>{Object.assign(ClassHandle.prototype,{isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;other.$$=other.$$;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right},clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}},delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError(\"Object already scheduled for deletion\")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}},isDeleted(){return!this.$$.ptr},deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError(\"Object already scheduled for deletion\")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}})};function ClassHandle(){}var createNamedFunction=(name,body)=>Object.defineProperty(body,\"name\",{value:name});var ensureOverloadTable=(proto,methodName,humanName)=>{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module[name].overloadTable.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var char_0=48;var char_9=57;var makeLegalFunctionName=name=>{name=name.replace(/[^a-zA-Z0-9_]/g,\"$\");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return`_${name}`}return name};function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}var upcastPointer=(ptr,ptrClass,desiredClass)=>{while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr};function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle||!handle.$$){throwBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError(\"Passing raw pointer to smart pointer is illegal\")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle[\"clone\"]();ptr=this.rawShare(ptr,Emval.toHandle(()=>clonedHandle[\"delete\"]()));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError(\"Unsupporting sharing policy\")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function readPointer(pointer){return this[\"fromWireType\"](HEAPU32[pointer>>2])}var init_RegisteredPointer=()=>{Object.assign(RegisteredPointer.prototype,{getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr},destructor(ptr){this.rawDestructor?.(ptr)},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,fromWireType:RegisteredPointer_fromWireType})};function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this[\"toWireType\"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this[\"toWireType\"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this[\"toWireType\"]=genericPointerToWireType}}var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError(\"Replacing nonexistent public symbol\")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var embind__requireFunction=(signature,rawFunction)=>{signature=readLatin1String(signature);function makeDynCaller(){return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!=\"function\"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};var extendError=(baseErrorType,errorName)=>{var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+\"\\n\"+stack.replace(/^Error(:[^\\n]*)?\\n/,\"\")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return`${this.name}: ${this.message}`}};return errorClass};var UnboundTypeError;var getTypeName=type=>{var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([\", \"]))};var __embind_register_class=(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor)=>{name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);upcast&&=embind__requireFunction(upcastSignature,upcast);downcast&&=embind__requireFunction(downcastSignature,downcast);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(`Cannot construct ${name} due to unbound types`,[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],base=>{base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(name,function(...args){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError(\"Use 'new' to construct \"+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+\" has no accessible constructor\")}var body=registeredClass.constructor_body[args.length];if(undefined===body){throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${args.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`)}return body.apply(this,args)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);if(registeredClass.baseClass){registeredClass.baseClass.__derivedClasses??=[];registeredClass.baseClass.__derivedClasses.push(registeredClass)}var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+\"*\",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+\" const*\",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i<count;i++){array.push(HEAPU32[firstElement+i*4>>2])}return array};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function usesDestructorStack(argTypes){for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){return true}}return false}function newFunc(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError(`new_ called with constructor type ${typeof constructor} which is not a function`)}var dummy=createNamedFunction(constructor.name||\"unknownFunctionName\",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function createJsInvoker(argTypes,isClassMethodFunc,returns,isAsync){var needsDestructorStack=usesDestructorStack(argTypes);var argCount=argTypes.length-2;var argsList=[];var argsListWired=[\"fn\"];if(isClassMethodFunc){argsListWired.push(\"thisWired\")}for(var i=0;i<argCount;++i){argsList.push(`arg${i}`);argsListWired.push(`arg${i}Wired`)}argsList=argsList.join(\",\");argsListWired=argsListWired.join(\",\");var invokerFnBody=`return function (${argsList}) {\\n`;if(needsDestructorStack){invokerFnBody+=\"var destructors = [];\\n\"}var dtorStack=needsDestructorStack?\"destructors\":\"null\";var args1=[\"humanName\",\"throwBindingError\",\"invoker\",\"fn\",\"runDestructors\",\"retType\",\"classParam\"];if(isClassMethodFunc){invokerFnBody+=`var thisWired = classParam['toWireType'](${dtorStack}, this);\\n`}for(var i=0;i<argCount;++i){invokerFnBody+=`var arg${i}Wired = argType${i}['toWireType'](${dtorStack}, arg${i});\\n`;args1.push(`argType${i}`)}invokerFnBody+=(returns||isAsync?\"var rv = \":\"\")+`invoker(${argsListWired});\\n`;if(needsDestructorStack){invokerFnBody+=\"runDestructors(destructors);\\n\"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?\"thisWired\":\"arg\"+(i-2)+\"Wired\";if(argTypes[i].destructorFunction!==null){invokerFnBody+=`${paramName}_dtor(${paramName});\\n`;args1.push(`${paramName}_dtor`)}}}if(returns){invokerFnBody+=\"var ret = retType['fromWireType'](rv);\\n\"+\"return ret;\\n\"}else{}invokerFnBody+=\"}\\n\";return[args1,invokerFnBody]}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc,isAsync){var argCount=argTypes.length;if(argCount<2){throwBindingError(\"argTypes array size mismatch! Must at least get return value and 'this' types!\")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=usesDestructorStack(argTypes);var returns=argTypes[0].name!==\"void\";var closureArgs=[humanName,throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];for(var i=0;i<argCount-2;++i){closureArgs.push(argTypes[i+2])}if(!needsDestructorStack){for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){if(argTypes[i].destructorFunction!==null){closureArgs.push(argTypes[i].destructorFunction)}}}let[args,invokerFnBody]=createJsInvoker(argTypes,isClassMethodFunc,returns,isAsync);args.push(invokerFnBody);var invokerFn=newFunc(Function,args)(...closureArgs);return createNamedFunction(humanName,invokerFn)}var __embind_register_class_constructor=(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`constructor ${classType.name}`;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`)}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`,rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf(\"(\");if(argsIndex!==-1){return signature.substr(0,argsIndex)}else{return signature}};var __embind_register_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual,isAsync,isNonnullReturn)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);methodName=getFunctionName(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`${classType.name}.${methodName}`;if(methodName.startsWith(\"@@\")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context,isAsync);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})};var validateThis=(this_,classType,humanName)=>{if(!(this_ instanceof Object)){throwBindingError(`${humanName} with invalid \"this\": ${this_}`)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(`${humanName} incompatible with \"this\" of type ${this_.constructor.name}`)}if(!this_.$$.ptr){throwBindingError(`cannot call emscripten binding method ${humanName} on deleted object`)}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)};var __embind_register_class_property=(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],classType=>{classType=classType[0];var humanName=`${classType.name}.${fieldName}`;var desc={get(){throwUnboundTypeError(`Cannot access ${humanName} due to unbound types`,[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=()=>throwUnboundTypeError(`Cannot access ${humanName} due to unbound types`,[getterReturnType,setterArgumentType])}else{desc.set=v=>throwBindingError(humanName+\" is a read-only property\")}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],types=>{var getterReturnType=types[0];var desc={get(){var ptr=validateThis(this,classType,humanName+\" getter\");return getterReturnType[\"fromWireType\"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+\" setter\");var destructors=[];setter(setterContext,ptr,setterArgumentType[\"toWireType\"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})};var emval_freelist=[];var emval_handles=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){emval_handles[handle]=undefined;emval_freelist.push(handle)}};var count_emval_handles=()=>emval_handles.length/2-5-emval_freelist.length;var init_emval=()=>{emval_handles.push(0,1,undefined,1,null,1,true,1,false,1);Module[\"count_emval_handles\"]=count_emval_handles};var Emval={toValue:handle=>{if(!handle){throwBindingError(\"Cannot use deleted val. handle = \"+handle)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:\"emscripten::val\",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var enumReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?function(pointer){return this[\"fromWireType\"](HEAP8[pointer])}:function(pointer){return this[\"fromWireType\"](HEAPU8[pointer])};case 2:return signed?function(pointer){return this[\"fromWireType\"](HEAP16[pointer>>1])}:function(pointer){return this[\"fromWireType\"](HEAPU16[pointer>>1])};case 4:return signed?function(pointer){return this[\"fromWireType\"](HEAP32[pointer>>2])}:function(pointer){return this[\"fromWireType\"](HEAPU32[pointer>>2])};default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_enum=(rawType,name,size,isSigned)=>{name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name,constructor:ctor,fromWireType:function(c){return this.constructor.values[c]},toWireType:(destructors,c)=>c.value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:enumReadValueFromPointer(name,size,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)};var requireRegisteredType=(rawType,humanName)=>{var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`)}return impl};var __embind_register_enum_value=(rawEnumType,name,enumValue)=>{var enumType=requireRegisteredType(rawEnumType,\"enum\");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(`${enumType.name}_${name}`,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value};var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this[\"fromWireType\"](HEAPF32[pointer>>2])};case 8:return function(pointer){return this[\"fromWireType\"](HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=readLatin1String(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync,isNonnullReturn)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<<bitshift>>>bitshift}var isUnsignedType=name.includes(\"unsigned\");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name,fromWireType,toWireType,argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name,fromWireType:decodeMemoryView,argPackAdvance:GenericWireTypeSize,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var __embind_register_std_string=(rawType,name)=>{name=readLatin1String(name);var stdStringIsUTF8=name===\"std::string\";registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[payload+i])}str=a.join(\"\")}_free(value);return str},toWireType(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var length;var valueIsOfTypeString=typeof value==\"string\";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError(\"Cannot pass non-string to std::string\")}if(stdStringIsUTF8&&valueIsOfTypeString){length=lengthBytesUTF8(value)}else{length=value.length}var base=_malloc(4+length+1);var ptr=base+4;HEAPU32[base>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError(\"String has UTF-16 code units that do not fit in 8 bits\")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+i]=value[i]}}}if(destructors!==null){destructors.push(_free,base)}return base},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var UTF16Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;var UTF16ToString=(ptr,maxBytesToRead)=>{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str=\"\";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str=\"\";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=readLatin1String(name);var decodeString,encodeString,readCharAt,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;readCharAt=pointer=>HEAPU16[pointer>>1]}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;readCharAt=pointer=>HEAPU32[pointer>>2]}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||readCharAt(currentBytePtr)==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value==\"string\")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_void=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{isVoid:true,name,argPackAdvance:0,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};embind_init_charCodes();BindingError=Module[\"BindingError\"]=class BindingError extends Error{constructor(message){super(message);this.name=\"BindingError\"}};InternalError=Module[\"InternalError\"]=class InternalError extends Error{constructor(message){super(message);this.name=\"InternalError\"}};init_ClassHandle();init_RegisteredPointer();UnboundTypeError=Module[\"UnboundTypeError\"]=extendError(Error,\"UnboundTypeError\");init_emval();var wasmImports={i:___cxa_throw,q:__abort_js,n:__embind_register_bigint,o:__embind_register_bool,g:__embind_register_class,f:__embind_register_class_constructor,a:__embind_register_class_function,e:__embind_register_class_property,s:__embind_register_emval,j:__embind_register_enum,c:__embind_register_enum_value,m:__embind_register_float,b:__embind_register_function,h:__embind_register_integer,d:__embind_register_memory_view,l:__embind_register_std_string,k:__embind_register_std_wstring,p:__embind_register_void,r:_emscripten_resize_heap};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports[\"u\"])();var ___getTypeName=a0=>(___getTypeName=wasmExports[\"v\"])(a0);var _malloc=a0=>(_malloc=wasmExports[\"x\"])(a0);var _free=a0=>(_free=wasmExports[\"y\"])(a0);var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module[\"onRuntimeInitialized\"]?.();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(()=>{setTimeout(()=>Module[\"setStatus\"](\"\"),1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();function MakePath64(intArray){if(intArray.length%2!=0){throw\"MakePath64: intArray.length must be even\"}var bigIntArray=intArray.map(function(item){if(typeof item!==\"bigint\"){return BigInt(item)}return item});let path=new Module[\"Path64\"];for(let i=0;i<bigIntArray.length;i+=2){let point=new Module[\"Point64\"](bigIntArray[i],bigIntArray[i+1],BigInt(0));path[\"push_back\"](point)}return path}Module[\"MakePath64\"]=MakePath64;function MakePathZ64(intArray){if(intArray.length%3!=0){throw\"MakePathZ64: intArray.length must be multiple of 3\"}var bigIntArray=intArray.map(function(item){if(typeof item!==\"bigint\"){return BigInt(item)}return item});let path=new Module[\"Path64\"];for(let i=0;i<bigIntArray.length;i+=3){let point=new Module[\"Point64\"](bigIntArray[i],bigIntArray[i+1],bigIntArray[i+2]);path[\"push_back\"](point)}return path}Module[\"MakePathZ64\"]=MakePathZ64;function MakePathD(intArray){if(intArray.length%2!=0){throw\"MakePathD: intArray.length must be even\"}let path=new Module[\"PathD\"];for(let i=0;i<intArray.length;i+=2){let point=new Module[\"PointD\"](intArray[i],intArray[i+1],0);path[\"push_back\"](point)}return path}Module[\"MakePathD\"]=MakePathD;function MakePathZD(intArray){if(intArray.length%3!=0){throw\"MakePathZD: intArray.length must be multiple of 3\"}let path=new Module[\"PathD\"];for(let i=0;i<intArray.length;i+=3){let point=new Module[\"PointD\"](intArray[i],intArray[i+1],intArray[i+2]);path[\"push_back\"](point)}return path}Module[\"MakePathZD\"]=MakePathZD;function PathDToPath64(pathD){let path=new Module[\"Path64\"];for(let i=0;i<pathD.size();i++){const p=pathD.get(i);const x=typeof p.x!==\"bigint\"?BigInt(Math.round(p.x)):p.x;const y=typeof p.y!==\"bigint\"?BigInt(Math.round(p.y)):p.y;const z=typeof p.z!==\"bigint\"?BigInt(Math.round(p.z)):p.z;let point=new Module[\"Point64\"](x,y,z);path[\"push_back\"](point)}return path}Module[\"PathDToPath64\"]=PathDToPath64;function Path64ToPathD(path64){let path=new Module[\"PathD\"];for(let i=0;i<path64.size();i++){const p=path64.get(i);let point=new Module[\"PointD\"](Number(p.x),Number(p.y),Number(p.z));path[\"push_back\"](point)}return path}Module[\"Path64ToPathD\"]=Path64ToPathD;function Paths64ToPathsD(paths64){let paths=new Module[\"PathsD\"];for(let i=0;i<paths64.size();i++){const path64=paths64.get(i);let path=Path64ToPathD(path64);paths[\"push_back\"](path)}return paths}Module[\"Paths64ToPathsD\"]=Paths64ToPathsD;function PathsDToPaths64(pathsD){let paths=new Module[\"Paths64\"];for(let i=0;i<pathsD.size();i++){const pathD=pathsD.get(i);let path=PathDToPath64(pathD);paths[\"push_back\"](path)}return paths}Module[\"PathsDToPaths64\"]=PathsDToPaths64;moduleRtn=readyPromise;\n\n\n return moduleRtn;\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n module.exports = Clipper2ZFactory;\nelse if (typeof define === 'function' && define['amd'])\n define([], () => Clipper2ZFactory);\n", "#!/usr/bin/env node\nimport { createHash } from \"node:crypto\";\nimport { execFileSync } from \"node:child_process\";\nimport { createServer as createHttpServer } from \"node:http\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { access, cp, mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, extname, relative, resolve, sep } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { filamentPresets, printerPresets } from \"@ignitefuse/presets\";\nimport { createIgniteFuseProject, findIgniteFuseProject, type IgniteFuseProject } from \"@ignitefuse/project\";\nimport { runFuseScript, summarizeToolpathGraph } from \"@ignitefuse/runtime\";\n\nconst DEFAULT_PORT = 17321;\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst CLI_DIR = dirname(fileURLToPath(import.meta.url));\nconst WEB_BUILD_DIRS = [\n resolve(CLI_DIR, \"../web\"),\n resolve(CLI_DIR, \"../../web/build\"),\n];\nconst SKILL_SOURCE_DIRS = [\n resolve(CLI_DIR, \"../skills\"),\n resolve(CLI_DIR, \"../../../skills\"),\n];\nconst AGENT_SKILL_NAMES = [\n \"ignitefuse\",\n \"ignitefuse-dev\",\n \"ignitefuse-make-toolpath\",\n \"ignitefuse-params\",\n \"ignitefuse-printer-scene\",\n \"ignitefuse-studio-mcp\",\n];\n\ntype ServeOptions = {\n port: number;\n};\n\ntype RuntimeStage = \"scene\" | \"toolpath\" | \"gcode\";\n\ntype RuntimeState = {\n clients: Set<RuntimeWebSocketClient>;\n lastGraph?: any;\n lastResult?: any;\n lastRunSummary?: any;\n lastToolpathSummary?: any;\n};\n\ntype RuntimeWebSocketClient = {\n send: (message: RuntimeServerMessage) => void;\n socket: {\n destroy: () => void;\n on: (event: string, listener: (...args: any[]) => void) => void;\n write: (data: Buffer | string) => void;\n };\n};\n\ntype RuntimeClientMessage =\n | { type: \"cancel\"; id?: string }\n | { type: \"readSource\"; id?: string }\n | { type: \"run\"; id?: string; stage?: RuntimeStage; values?: Record<string, number | boolean | string> }\n | { type: \"writeSource\"; id?: string; source?: string };\n\ntype RuntimeServerMessage =\n | { type: \"error\"; id?: string; message: string }\n | { type: \"progress\"; id?: string; label: string; percent?: number; stage: RuntimeStage }\n | { type: \"ready\"; mcpUrl: string; project: ReturnType<typeof projectResource> }\n | { type: \"result\"; id?: string; summary: any }\n | { type: \"source\"; id?: string; entry: string; source: string }\n | { type: \"sourceChanged\"; entry: string; source: string };\n\nconst help = `IgniteFuse\n\nUsage:\n ignitefuse create <project-dir>\n ignitefuse [serve] <project-dir> [--port <port>]\n ignitefuse check <project-dir>\n ignitefuse skills status [codex|claude|all]\n ignitefuse skills install [codex|claude|all]\n ignitefuse mcp install <codex|claude> --url <mcp-url> [--project <project-dir>]\n\nExamples:\n ignitefuse create ./my-print\n ignitefuse ./my-print\n ignitefuse serve ./my-print --port 17321\n ignitefuse skills install codex\n ignitefuse mcp install codex --url http://127.0.0.1:17321/mcp\n`;\n\nasync function main(argv: string[]) {\n const [commandOrPath, ...rest] = argv;\n\n if (!commandOrPath || commandOrPath === \"-h\" || commandOrPath === \"--help\") {\n console.log(help);\n return;\n }\n\n if (commandOrPath === \"create\") {\n const target = rest[0];\n if (!target) {\n throw new Error(\"Missing project directory. Usage: ignitefuse create <project-dir>\");\n }\n const project = await createIgniteFuseProject(resolveCliPath(target));\n console.log(`Created IgniteFuse project at ${project.root}`);\n return;\n }\n\n if (commandOrPath === \"check\") {\n const target = rest[0] ?? \".\";\n const project = await findIgniteFuseProject(resolveCliPath(target));\n console.log(`IgniteFuse project: ${project.root}`);\n console.log(`Entry: ${project.entryFile}`);\n return;\n }\n\n if (commandOrPath === \"skills\") {\n await handleSkillsCommand(rest);\n return;\n }\n\n if (commandOrPath === \"mcp\") {\n await handleMcpCommand(rest);\n return;\n }\n\n if (commandOrPath === \"serve\") {\n const target = rest[0] ?? \".\";\n await serveProject(resolveCliPath(target), parseServeOptions(rest.slice(1)));\n return;\n }\n\n await serveProject(resolveCliPath(commandOrPath), parseServeOptions(rest));\n}\n\nfunction resolveCliPath(path: string) {\n return resolve(path);\n}\n\nfunction parseServeOptions(args: string[]): ServeOptions {\n return {\n port: parsePortOption(args, \"--port\", DEFAULT_PORT),\n };\n}\n\nfunction parsePortOption(args: string[], name: string, defaultPort: number) {\n const index = args.indexOf(name);\n if (index === -1) {\n return defaultPort;\n }\n\n const value = args[index + 1];\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0) {\n throw new Error(`Invalid ${name} value: ${value}`);\n }\n return port;\n}\n\nasync function handleSkillsCommand(args: string[]) {\n const [action = \"status\", target = \"all\"] = args;\n\n if (action === \"-h\" || action === \"--help\") {\n console.log(`Usage:\n ignitefuse skills status [codex|claude|all]\n ignitefuse skills install [codex|claude|all]`);\n return;\n }\n\n const targets = parseAgentTargets(target);\n if (action === \"status\") {\n for (const agent of targets) {\n const status = await agentSkillStatus(agent);\n console.log(`${status.label}: ${status.installed ? \"installed\" : \"not installed\"} (${status.path})`);\n }\n return;\n }\n\n if (action === \"install\") {\n const sourceRoot = await bundledSkillSourceRoot();\n for (const agent of targets) {\n const status = await installAgentSkills(agent, sourceRoot);\n console.log(`${status.label}: installed ${AGENT_SKILL_NAMES.length} skills to ${status.path}`);\n }\n return;\n }\n\n throw new Error(`Unknown skills command: ${action}`);\n}\n\nasync function handleMcpCommand(args: string[]) {\n const [action, target] = args;\n\n if (!action || action === \"-h\" || action === \"--help\") {\n console.log(`Usage:\n ignitefuse mcp install <codex|claude> --url <mcp-url> [--project <project-dir>]`);\n return;\n }\n\n if (action !== \"install\") {\n throw new Error(`Unknown mcp command: ${action}`);\n }\n\n const url = optionValue(args, \"--url\");\n if (!url) {\n throw new Error(\"Missing MCP URL. Usage: ignitefuse mcp install <codex|claude> --url <mcp-url>\");\n }\n\n if (target === \"codex\") {\n const path = await installCodexMcpConfig(url);\n console.log(`Codex MCP configured for IgniteFuse (${path})`);\n return;\n }\n\n if (target === \"claude\") {\n const projectPath = optionValue(args, \"--project\");\n const path = await installClaudeMcpConfig(url, projectPath ? resolveCliPath(projectPath) : undefined);\n console.log(`Claude Code MCP configured for IgniteFuse (${path})`);\n return;\n }\n\n throw new Error(\"Missing MCP target. Usage: ignitefuse mcp install <codex|claude> --url <mcp-url>\");\n}\n\ntype AgentTarget = \"codex\" | \"claude\";\n\nfunction parseAgentTargets(target: string): AgentTarget[] {\n if (target === \"all\") return [\"codex\", \"claude\"];\n if (target === \"codex\" || target === \"claude\") return [target];\n throw new Error(`Unsupported agent target: ${target}`);\n}\n\nfunction optionValue(args: string[], name: string) {\n const index = args.indexOf(name);\n if (index === -1) return undefined;\n return args[index + 1];\n}\n\nfunction agentSkillDestination(target: AgentTarget) {\n const root =\n target === \"codex\"\n ? process.env.CODEX_HOME || resolve(homedir(), \".codex\")\n : process.env.CLAUDE_HOME || resolve(homedir(), \".claude\");\n\n return {\n label: target === \"codex\" ? \"Codex\" : \"Claude Code\",\n path: resolve(root, \"skills\"),\n target,\n };\n}\n\nasync function agentSkillStatus(target: AgentTarget) {\n const destination = agentSkillDestination(target);\n const installed = await Promise.all(\n AGENT_SKILL_NAMES.map((name) => pathExists(resolve(destination.path, name, \"SKILL.md\"))),\n );\n\n return {\n ...destination,\n installed: installed.every(Boolean),\n };\n}\n\nasync function installAgentSkills(target: AgentTarget, sourceRoot: string) {\n const destination = agentSkillDestination(target);\n await mkdir(destination.path, { recursive: true });\n\n for (const skillName of AGENT_SKILL_NAMES) {\n const source = resolve(sourceRoot, skillName);\n const targetPath = resolve(destination.path, skillName);\n await rm(targetPath, { force: true, recursive: true });\n await cp(source, targetPath, { recursive: true });\n }\n\n return agentSkillStatus(target);\n}\n\nasync function bundledSkillSourceRoot() {\n for (const root of SKILL_SOURCE_DIRS) {\n const complete = await Promise.all(\n AGENT_SKILL_NAMES.map((name) => pathExists(resolve(root, name, \"SKILL.md\"))),\n );\n if (complete.every(Boolean)) {\n return root;\n }\n }\n\n throw new Error(\"Bundled IgniteFuse skills were not found.\");\n}\n\nasync function pathExists(path: string) {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function installCodexMcpConfig(url: string) {\n if (commandHelpIncludes(\"codex\", [\"mcp\", \"add\", \"--help\"], \"--url\")) {\n commandOutputIgnored(\"codex\", [\"mcp\", \"remove\", \"ignitefuse\"]);\n commandOutput(\"codex\", [\"mcp\", \"add\", \"ignitefuse\", \"--url\", url]);\n return \"Codex CLI user scope\";\n }\n\n const path = resolve(process.env.CODEX_HOME || resolve(homedir(), \".codex\"), \"config.toml\");\n const content = await readOptionalTextFile(path);\n const nextContent = upsertTomlTable(content, \"mcp_servers.ignitefuse\", `url = ${JSON.stringify(url)}`);\n await writeTextFile(path, nextContent);\n return path;\n}\n\nasync function installClaudeMcpConfig(url: string, projectPath?: string) {\n if (commandHelpIncludes(\"claude\", [\"mcp\", \"add\", \"--help\"], \"--transport\") && commandHelpIncludes(\"claude\", [\"mcp\", \"add\", \"--help\"], \"--scope\")) {\n commandOutputIgnored(\"claude\", [\"mcp\", \"remove\", \"--scope\", \"user\", \"ignitefuse\"]);\n commandOutput(\"claude\", [\"mcp\", \"add\", \"--scope\", \"user\", \"--transport\", \"http\", \"ignitefuse\", url]);\n return \"Claude Code user scope\";\n }\n\n if (!projectPath) {\n throw new Error(\"Claude Code CLI MCP command is unavailable. Pass --project <project-dir> to write .mcp.json.\");\n }\n\n const path = resolve(projectPath, \".mcp.json\");\n const content = await readOptionalTextFile(path);\n const root = content.trim() ? JSON.parse(content) : {};\n const nextRoot = typeof root === \"object\" && root !== null && !Array.isArray(root) ? root as Record<string, any> : {};\n const servers = typeof nextRoot.mcpServers === \"object\" && nextRoot.mcpServers !== null && !Array.isArray(nextRoot.mcpServers)\n ? nextRoot.mcpServers as Record<string, any>\n : {};\n servers.ignitefuse = { url };\n nextRoot.mcpServers = servers;\n await writeTextFile(path, `${JSON.stringify(nextRoot, null, 2)}\\n`);\n return path;\n}\n\nfunction commandHelpIncludes(command: string, args: string[], needle: string) {\n try {\n return commandOutput(command, args).includes(needle);\n } catch {\n return false;\n }\n}\n\nfunction commandOutput(command: string, args: string[]) {\n return execFileSync(command, args, { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] }).trim();\n}\n\nfunction commandOutputIgnored(command: string, args: string[]) {\n try {\n execFileSync(command, args, { stdio: \"ignore\" });\n } catch {\n // Removing an existing MCP registration is best-effort before re-adding it.\n }\n}\n\nasync function readOptionalTextFile(path: string) {\n try {\n return await readFile(path, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return \"\";\n throw error;\n }\n}\n\nasync function writeTextFile(path: string, content: string) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, \"utf8\");\n}\n\nfunction upsertTomlTable(content: string, header: string, body: string) {\n const lines = content.split(/\\r?\\n/);\n const headerLine = `[${header}]`;\n const start = lines.findIndex((line) => line.trim() === headerLine);\n const nextBlock = `${headerLine}\\n${body}`;\n\n if (start === -1) {\n const separator = content.trim() ? \"\\n\\n\" : \"\";\n return `${content.trimEnd()}${separator}${nextBlock}\\n`;\n }\n\n const end = lines.findIndex((line, index) => index > start && /^\\s*\\[.+\\]\\s*$/.test(line));\n const nextLines = [\n ...lines.slice(0, start),\n ...nextBlock.split(\"\\n\"),\n ...lines.slice(end === -1 ? lines.length : end),\n ];\n\n return `${nextLines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nasync function serveProject(projectPath: string, options: ServeOptions) {\n const project = await findIgniteFuseProject(projectPath);\n await mkdir(project.outputDir, { recursive: true });\n const runtimeState: RuntimeState = { clients: new Set() };\n const mcp = {\n fallback: false,\n host: DEFAULT_HOST,\n port: options.port,\n preferredPort: DEFAULT_PORT,\n url: `http://${DEFAULT_HOST}:${options.port}/mcp`,\n };\n\n const server = createHttpServer(async (request, response) => {\n try {\n const url = new URL(request.url ?? \"/\", `http://${request.headers.host ?? \"localhost\"}`);\n\n if (url.pathname === \"/mcp\") {\n await handleMcpRequest(project, runtimeState, request, response);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n await handleProjectApiRequest(project, runtimeState, mcp, request, response, url);\n return;\n }\n\n await serveWebApp(response, url);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n response.writeHead(500, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(message);\n }\n });\n server.on(\"upgrade\", (request, socket) => {\n void handleRuntimeUpgrade(project, runtimeState, mcp.url, request, socket as RuntimeWebSocketClient[\"socket\"]);\n });\n\n await new Promise<void>((resolveListen, rejectListen) => {\n server.once(\"error\", rejectListen);\n server.listen(options.port, DEFAULT_HOST, () => {\n server.off(\"error\", rejectListen);\n resolveListen();\n });\n });\n\n const url = `http://${DEFAULT_HOST}:${options.port}`;\n console.log(`IgniteFuse local host: ${url}`);\n console.log(`IgniteFuse runtime WebSocket: ws://${DEFAULT_HOST}:${options.port}/runtime`);\n console.log(`IgniteFuse MCP endpoint: ${mcp.url}`);\n console.log(`Project: ${project.root}`);\n console.log(`Source: ${pathToFileURL(project.entryFile).href}`);\n}\n\nasync function handleProjectApiRequest(\n project: IgniteFuseProject,\n runtimeState: RuntimeState,\n mcp: { fallback: boolean; host: string; port: number; preferredPort: number; url: string },\n request: IncomingMessage,\n response: ServerResponse,\n url: URL,\n) {\n if (request.method === \"GET\" && url.pathname === \"/api/project\") {\n writeJson(response, 200, project);\n return;\n }\n\n if (request.method === \"GET\" && url.pathname === \"/api/project-snapshot\") {\n writeJson(response, 200, await projectSnapshot(project));\n return;\n }\n\n if (url.pathname === \"/api/source\") {\n if (request.method === \"GET\") {\n response.writeHead(200, { \"content-type\": \"text/javascript; charset=utf-8\" });\n response.end(await readFile(project.entryFile, \"utf8\"));\n return;\n }\n\n if (request.method === \"POST\") {\n const body = JSON.parse(await readRequestBody(request)) as { source?: unknown };\n if (typeof body.source !== \"string\") {\n throw new Error(\"/api/source requires a string source.\");\n }\n await writeFile(project.entryFile, body.source, \"utf8\");\n broadcastRuntime(runtimeState, { type: \"sourceChanged\", entry: project.config.entry, source: body.source });\n writeJson(response, 200, await projectSnapshot(project));\n return;\n }\n }\n\n if (request.method === \"GET\" && url.pathname === \"/api/project-file\") {\n const path = url.searchParams.get(\"path\");\n if (!path) {\n throw new Error(\"/api/project-file requires a path query.\");\n }\n response.writeHead(200, { \"content-type\": contentTypeFor(path) });\n response.end(await readProjectFileBytes(project, path));\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/api/import-stl\") {\n const filename = url.searchParams.get(\"filename\");\n if (!filename) {\n throw new Error(\"/api/import-stl requires a filename query.\");\n }\n await importStlToProject(project, filename, await readRequestBytes(request));\n writeJson(response, 200, await projectSnapshot(project));\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/api/remove-model\") {\n const body = JSON.parse(await readRequestBody(request)) as { path?: unknown };\n if (typeof body.path !== \"string\") {\n throw new Error(\"/api/remove-model requires a string path.\");\n }\n await removeModelFromProject(project, body.path);\n writeJson(response, 200, await projectSnapshot(project));\n return;\n }\n\n if (request.method === \"GET\" && url.pathname === \"/api/agent-mcp-status\") {\n writeJson(response, 200, {\n activeProjectRoot: project.root,\n claudeConfig: \"\",\n codexConfig: \"\",\n fallback: mcp.fallback,\n host: mcp.host,\n port: mcp.port,\n preferredPort: mcp.preferredPort,\n running: true,\n tools: mcpTools().map((tool) => tool.name),\n url: mcp.url,\n });\n return;\n }\n\n response.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n}\n\nasync function serveWebApp(response: ServerResponse, url: URL) {\n const requestedPath = url.pathname === \"/\" ? \"index.html\" : decodeURIComponent(url.pathname.slice(1));\n\n for (const buildDir of WEB_BUILD_DIRS) {\n const absolutePath = resolve(buildDir, requestedPath);\n const buildRoot = `${buildDir}${sep}`;\n\n if (absolutePath !== buildDir && !absolutePath.startsWith(buildRoot)) {\n response.writeHead(400, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(\"Invalid path\");\n return;\n }\n\n try {\n response.writeHead(200, { \"content-type\": contentTypeFor(absolutePath) });\n response.end(await readFile(absolutePath));\n return;\n } catch {\n try {\n response.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(await readFile(resolve(buildDir, \"index.html\"), \"utf8\"));\n return;\n } catch {\n // Try the next candidate build directory.\n }\n }\n }\n\n response.writeHead(503, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(\"IgniteFuse web build not found. Run `pnpm build:cli` or use `pnpm dev:cli <project-dir>` during development.\");\n}\n\nasync function projectSnapshot(project: IgniteFuseProject) {\n return {\n root: project.root,\n manifest: {\n active_model: project.config.active_model ?? null,\n entry: project.config.entry,\n models: project.config.models ?? [],\n name: project.config.name,\n version: project.config.version ?? 1,\n },\n source: await readFile(project.entryFile, \"utf8\"),\n };\n}\n\nasync function importStlToProject(project: IgniteFuseProject, filename: string, bytes: Buffer) {\n if (bytes.length === 0) {\n throw new Error(\"Imported STL is empty.\");\n }\n\n const safeFilename = safeStlFilename(filename);\n await mkdir(project.modelsDir, { recursive: true });\n const destination = await nextAvailableModelPath(project.modelsDir, safeFilename);\n await writeFile(destination, bytes);\n\n const relativePath = relative(project.root, destination).split(sep).join(\"/\");\n const models = project.config.models ?? [];\n if (!models.some((model) => model.path === relativePath)) {\n models.push({ kind: \"stl\", path: relativePath });\n }\n project.config.models = models;\n project.config.active_model = relativePath;\n await writeProjectConfig(project);\n}\n\nasync function removeModelFromProject(project: IgniteFuseProject, path: string) {\n if (!isSafeProjectRelativePath(path)) {\n throw new Error(\"Model path must be relative and stay inside the project.\");\n }\n\n const models = project.config.models ?? [];\n const model = models.find((candidate) => candidate.path === path);\n if (!model) {\n throw new Error(`Model is not registered in the project: ${path}`);\n }\n\n await rm(resolve(project.root, path), { force: true });\n project.config.models = models.filter((candidate) => candidate.path !== path);\n if (project.config.active_model === path) {\n project.config.active_model = project.config.models[0]?.path;\n }\n await writeProjectConfig(project);\n}\n\nfunction safeStlFilename(filename: string) {\n const name = basename(filename).replace(/[^\\w .()-]+/g, \"_\").trim();\n if (!name || name === \".\" || name === \"..\") {\n throw new Error(\"Imported STL must have a file name.\");\n }\n if (extname(name).toLowerCase() !== \".stl\") {\n throw new Error(\"Imported file must have a .stl extension.\");\n }\n return name;\n}\n\nasync function nextAvailableModelPath(dir: string, filename: string) {\n const extension = extname(filename);\n const stem = filename.slice(0, -extension.length);\n let candidate = resolve(dir, filename);\n let index = 2;\n\n while (await fileExists(candidate)) {\n candidate = resolve(dir, `${stem}-${index}${extension}`);\n index += 1;\n }\n\n return candidate;\n}\n\nasync function fileExists(path: string) {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeProjectConfig(project: IgniteFuseProject) {\n await writeFile(project.configPath, `${JSON.stringify(project.config, null, 2)}\\n`, \"utf8\");\n}\n\nasync function readProjectFileBytes(project: IgniteFuseProject, relativePath: string) {\n if (!isSafeProjectRelativePath(relativePath)) {\n throw new Error(\"Project file path must be relative and stay inside the project.\");\n }\n return readFile(resolve(project.root, relativePath));\n}\n\nfunction isSafeProjectRelativePath(path: string) {\n return Boolean(path) && !path.startsWith(\"/\") && !path.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction contentTypeFor(path: string) {\n switch (extname(path)) {\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".json\":\n return \"application/json\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".wasm\":\n return \"application/wasm\";\n case \".stl\":\n return \"model/stl\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nasync function listen(server: ReturnType<typeof createHttpServer>, port: number) {\n await new Promise<void>((resolveListen, rejectListen) => {\n server.once(\"error\", rejectListen);\n server.listen(port, DEFAULT_HOST, () => {\n server.off(\"error\", rejectListen);\n resolveListen();\n });\n });\n}\n\nasync function handleMcpRequest(project: IgniteFuseProject, runtimeState: RuntimeState, request: IncomingMessage, response: ServerResponse) {\n setCorsHeaders(response);\n\n if (request.method === \"OPTIONS\") {\n response.writeHead(204);\n response.end();\n return;\n }\n\n if (request.method === \"GET\" && request.url === \"/health\") {\n writeJson(response, 200, { ok: true, server: \"ignitefuse-cli\", project: project.root });\n return;\n }\n\n if (request.method !== \"POST\" || request.url !== \"/mcp\") {\n response.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n\n const body = await readRequestBody(request);\n const message = JSON.parse(body) as JsonRpcRequest;\n const result = await handleMcpMessage(project, runtimeState, message);\n\n if (!result) {\n response.writeHead(202, { \"content-type\": \"application/json\" });\n response.end(\"{}\");\n return;\n }\n\n writeJson(response, 200, result);\n}\n\nasync function handleMcpMessage(project: IgniteFuseProject, runtimeState: RuntimeState, request: JsonRpcRequest): Promise<JsonRpcResponse | null> {\n if (request.id === undefined || request.id === null) {\n return null;\n }\n\n try {\n switch (request.method) {\n case \"initialize\":\n return jsonRpcResult(request.id, {\n protocolVersion: request.params?.protocolVersion ?? \"2024-11-05\",\n capabilities: { tools: {}, resources: {} },\n serverInfo: { name: \"ignitefuse-cli\", version: \"0.1.0\" },\n });\n case \"ping\":\n return jsonRpcResult(request.id, {});\n case \"tools/list\":\n return jsonRpcResult(request.id, { tools: mcpTools() });\n case \"resources/list\":\n return jsonRpcResult(request.id, { resources: mcpResources() });\n case \"resources/templates/list\":\n return jsonRpcResult(request.id, { resourceTemplates: mcpResourceTemplates() });\n case \"resources/read\":\n return jsonRpcResult(request.id, await mcpReadResource(project, runtimeState, String(request.params?.uri ?? \"\")));\n case \"tools/call\":\n return jsonRpcResult(\n request.id,\n await mcpCallTool(project, runtimeState, String(request.params?.name ?? \"\"), request.params?.arguments ?? {}),\n );\n default:\n return jsonRpcError(request.id, -32601, `Unsupported MCP method: ${request.method}`);\n }\n } catch (error) {\n return jsonRpcError(request.id, -32000, error instanceof Error ? error.message : String(error));\n }\n}\n\nasync function mcpReadResource(project: IgniteFuseProject, runtimeState: RuntimeState, uri: string) {\n switch (uri) {\n case \"ignitefuse://project\":\n return mcpJsonResource(uri, projectResource(project));\n case \"ignitefuse://source\":\n return mcpJsonResource(uri, await sourceResource(project));\n case \"ignitefuse://models\":\n return mcpJsonResource(uri, await modelsResource(project));\n case \"ignitefuse://placements\":\n return mcpJsonResource(uri, { entry: project.config.entry, placements: [] });\n case \"ignitefuse://printer\":\n return mcpJsonResource(uri, currentPrinterResource(runtimeState));\n case \"ignitefuse://printer-presets\":\n return mcpJsonResource(uri, printerPresetsResource());\n case \"ignitefuse://filament-presets\":\n return mcpJsonResource(uri, filamentPresetsResource());\n case \"ignitefuse://run-result\":\n return mcpJsonResource(uri, requireRunSummary(runtimeState));\n case \"ignitefuse://toolpath-summary\":\n return mcpJsonResource(uri, requireToolpathSummary(runtimeState));\n case \"ignitefuse://skill-guide\":\n return {\n contents: [\n {\n uri,\n mimeType: \"text/markdown\",\n text: \"# IgniteFuse CLI MCP\\n\\nUse `ignitefuse <project-dir>` to start the local host and MCP endpoint. Prefer `ignitefuse://source` and `write_source` for active `.fuse.js` edits.\",\n },\n ],\n };\n default:\n if (uri.startsWith(\"ignitefuse://project-file/\")) {\n const path = decodeURIComponent(uri.slice(\"ignitefuse://project-file/\".length));\n return {\n contents: [\n {\n uri,\n mimeType: \"text/plain\",\n text: await readProjectTextFile(project, path),\n },\n ],\n };\n }\n if (uri.startsWith(\"ignitefuse://toolpath-layer/\")) {\n const { layerIndex, query } = parseToolpathLayerUri(uri);\n return mcpJsonResource(uri, getToolpathLayer(runtimeState, { layerIndex, ...query }));\n }\n if (uri.startsWith(\"ignitefuse://toolpath-path/\")) {\n const { layerIndex, pathId, query } = parseToolpathPathUri(uri);\n return mcpJsonResource(uri, getToolpathPath(runtimeState, { layerIndex, pathId, ...query }));\n }\n throw new Error(`Unknown MCP resource URI: ${uri}`);\n }\n}\n\nasync function mcpCallTool(project: IgniteFuseProject, runtimeState: RuntimeState, name: string, args: Record<string, unknown>) {\n switch (name) {\n case \"get_project\":\n return mcpText(projectResource(project));\n case \"read_source\":\n return mcpText(await sourceResource(project));\n case \"write_source\": {\n const source = args.source;\n if (typeof source !== \"string\") {\n throw new Error(\"write_source requires a string source.\");\n }\n await writeFile(project.entryFile, source, \"utf8\");\n broadcastRuntime(runtimeState, { type: \"sourceChanged\", entry: project.config.entry, source });\n return mcpText({ entry: project.config.entry, ok: true });\n }\n case \"list_models\":\n return mcpText(await modelsResource(project));\n case \"list_printer_presets\":\n return mcpText(printerPresetsResource());\n case \"list_filament_presets\":\n return mcpText(filamentPresetsResource());\n case \"get_printer\":\n return mcpText(currentPrinterResource(runtimeState));\n case \"list_placements\":\n return mcpText({ entry: project.config.entry, placements: [] });\n case \"place_model\":\n case \"update_placement\":\n case \"remove_placement\":\n throw new Error(`${name} is not wired in the CLI MCP bridge yet.`);\n case \"run_project\":\n return mcpText(await runProject(project, runtimeState, args, (progress) => {\n broadcastRuntime(runtimeState, { type: \"progress\", ...progress });\n }));\n case \"set_view\":\n return mcpText({ ok: true, message: \"CLI MCP has no native view to update.\" });\n case \"read_project_text_file\": {\n const path = args.path;\n if (typeof path !== \"string\") {\n throw new Error(\"read_project_text_file requires a path.\");\n }\n return mcpText({ path, text: await readProjectTextFile(project, path) });\n }\n case \"get_run_result\":\n return mcpText(requireRunSummary(runtimeState));\n case \"get_toolpath_summary\":\n return mcpText(requireToolpathSummary(runtimeState));\n case \"get_toolpath_layer\":\n return mcpText(getToolpathLayer(runtimeState, {\n includePoints: typeof args.includePoints === \"boolean\" ? args.includePoints : false,\n layerIndex: numberArg(args.layerIndex, \"layerIndex\"),\n maxPaths: typeof args.maxPaths === \"number\" ? args.maxPaths : undefined,\n roles: Array.isArray(args.roles) ? args.roles.map(String) : undefined,\n }));\n case \"get_toolpath_path\":\n return mcpText(getToolpathPath(runtimeState, {\n includePoints: typeof args.includePoints === \"boolean\" ? args.includePoints : true,\n layerIndex: numberArg(args.layerIndex, \"layerIndex\"),\n pathId: stringArg(args.pathId, \"pathId\"),\n }));\n default:\n throw new Error(`Unknown MCP tool: ${name}`);\n }\n}\n\nfunction mcpTools() {\n return [\n {\n name: \"get_project\",\n description: \"Read the active IgniteFuse project metadata.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"read_source\",\n description: \"Read the active .fuse.js manufacturing document.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"write_source\",\n description: \"Replace the active .fuse.js manufacturing document.\",\n inputSchema: {\n type: \"object\",\n properties: {\n source: { type: \"string\", description: \"Full .fuse.js source to write.\" },\n },\n required: [\"source\"],\n },\n },\n {\n name: \"list_models\",\n description: \"List STL models registered in the active IgniteFuse project.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"list_printer_presets\",\n description: \"List bundled printer presets available to .fuse.js preset(id).\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"list_filament_presets\",\n description: \"List bundled filament presets available to .fuse.js filament(id).\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"get_printer\",\n description: \"Read the latest printer profile exported by the active project scene.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"place_model\",\n description: \"Insert an imported STL model into the active .fuse.js scene placement block.\",\n inputSchema: { type: \"object\", properties: { path: { type: \"string\" } }, required: [\"path\"] },\n },\n {\n name: \"list_placements\",\n description: \"List model(...) scene placements currently declared in the active .fuse.js placement block.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"update_placement\",\n description: \"Update an existing model(...) scene placement in the active .fuse.js placement block.\",\n inputSchema: { type: \"object\", properties: { id: { type: \"string\" } }, required: [\"id\"] },\n },\n {\n name: \"remove_placement\",\n description: \"Remove an existing model(...) scene placement from the active .fuse.js placement block.\",\n inputSchema: { type: \"object\", properties: { id: { type: \"string\" } }, required: [\"id\"] },\n },\n {\n name: \"run_project\",\n description: \"Ask the running app host to execute the active project stage.\",\n inputSchema: {\n type: \"object\",\n properties: {\n stage: { type: \"string\", enum: [\"scene\", \"toolpath\", \"gcode\"] },\n sidePanel: { type: \"string\", enum: [\"params\", \"stats\", \"diagnostics\"] },\n outputOpen: { type: \"boolean\" },\n },\n },\n },\n {\n name: \"set_view\",\n description: \"Ask the running app host to switch visible stage and side-panel tabs without running the project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n stage: { type: \"string\", enum: [\"scene\", \"toolpath\", \"gcode\"] },\n sidePanel: { type: \"string\", enum: [\"params\", \"stats\", \"diagnostics\"] },\n outputOpen: { type: \"boolean\" },\n sourceOpen: { type: \"boolean\" },\n gcodeTextOpen: { type: \"boolean\" },\n },\n },\n },\n {\n name: \"read_project_text_file\",\n description: \"Read a UTF-8 text file inside the active IgniteFuse project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Relative path inside the project.\" },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"get_run_result\",\n description: \"Read the latest stage, run/export summary, scene metadata, stats, and diagnostics.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"get_toolpath_summary\",\n description: \"Read the latest lightweight toolpath summary without per-path point samples.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"get_toolpath_layer\",\n description: \"Read one layer from the latest toolpath snapshot, optionally filtered by role and sampled points.\",\n inputSchema: {\n type: \"object\",\n properties: {\n layerIndex: { type: \"number\" },\n roles: { type: \"array\", items: { type: \"string\" } },\n maxPaths: { type: \"number\" },\n includePoints: { type: \"boolean\" },\n },\n required: [\"layerIndex\"],\n },\n },\n {\n name: \"get_toolpath_path\",\n description: \"Read one path summary from the latest toolpath snapshot, including sampled points by default.\",\n inputSchema: {\n type: \"object\",\n properties: {\n layerIndex: { type: \"number\" },\n pathId: { type: \"string\" },\n includePoints: { type: \"boolean\" },\n },\n required: [\"layerIndex\", \"pathId\"],\n },\n },\n ];\n}\n\nfunction mcpResources() {\n return [\n {\n uri: \"ignitefuse://project\",\n name: \"project\",\n title: \"Active IgniteFuse Project\",\n description: \"Active project metadata and entry file.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://source\",\n name: \"source\",\n title: \"Active .fuse.js Source\",\n description: \"The active .fuse.js manufacturing document.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://models\",\n name: \"models\",\n title: \"Imported Models\",\n description: \"STL models registered in the active project.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://placements\",\n name: \"placements\",\n title: \"Scene Placements\",\n description: \"Generated model(...) placements declared in the active .fuse.js source.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://printer\",\n name: \"printer\",\n title: \"Latest Project Printer Profile\",\n description: \"Printer profile from the latest exported scene metadata.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://printer-presets\",\n name: \"printer-presets\",\n title: \"Bundled Printer Presets\",\n description: \"Bundled printer presets available to .fuse.js preset(id).\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://filament-presets\",\n name: \"filament-presets\",\n title: \"Bundled Filament Presets\",\n description: \"Bundled filament presets available to .fuse.js filament(id).\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://run-result\",\n name: \"run-result\",\n title: \"Latest Run Result\",\n description: \"Latest runtime result, diagnostics, scene metadata, and stats.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://toolpath-summary\",\n name: \"toolpath-summary\",\n title: \"Toolpath Summary\",\n description: \"Lightweight latest toolpath summary without per-path point samples.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"ignitefuse://skill-guide\",\n name: \"skill-guide\",\n title: \"IgniteFuse MCP Guide\",\n description: \"Short guide for agent workflows against IgniteFuse CLI MCP.\",\n mimeType: \"text/markdown\",\n },\n ];\n}\n\nfunction mcpResourceTemplates() {\n return [\n {\n uriTemplate: \"ignitefuse://project-file/{path}\",\n name: \"project-file\",\n title: \"Project Text File\",\n description: \"Read a UTF-8 text file inside the active project by relative path.\",\n mimeType: \"text/plain\",\n },\n {\n uriTemplate: \"ignitefuse://toolpath-layer/{layerIndex}{?roles,maxPaths,includePoints}\",\n name: \"toolpath-layer\",\n title: \"Toolpath Layer\",\n description: \"Read one sampled toolpath layer, optionally filtered by roles.\",\n mimeType: \"application/json\",\n },\n {\n uriTemplate: \"ignitefuse://toolpath-path/{layerIndex}/{pathId}{?includePoints}\",\n name: \"toolpath-path\",\n title: \"Toolpath Path\",\n description: \"Read one sampled path from one toolpath layer.\",\n mimeType: \"application/json\",\n },\n ];\n}\n\nfunction projectResource(project: IgniteFuseProject) {\n return {\n activeModel: null,\n entry: project.config.entry,\n entryFile: project.entryFile,\n models: [],\n modelsDir: project.modelsDir,\n name: project.config.name,\n outputDir: project.outputDir,\n root: project.root,\n version: 1,\n };\n}\n\nasync function sourceResource(project: IgniteFuseProject) {\n return {\n entry: project.config.entry,\n source: await readFile(project.entryFile, \"utf8\"),\n };\n}\n\nasync function modelsResource(project: IgniteFuseProject) {\n let entries: string[] = [];\n try {\n entries = await listModelFiles(project.modelsDir);\n } catch {\n entries = [];\n }\n return {\n activeModel: null,\n models: entries.map((path) => ({ path: relative(project.root, path) })),\n };\n}\n\nasync function listModelFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const path = `${dir}/${entry.name}`;\n if (entry.isDirectory()) {\n return listModelFiles(path);\n }\n return entry.isFile() && entry.name.toLowerCase().endsWith(\".stl\") ? [path] : [];\n }),\n );\n return files.flat();\n}\n\nasync function readProjectTextFile(project: IgniteFuseProject, relativePath: string) {\n if (relativePath.startsWith(\"/\") || relativePath.includes(\"..\")) {\n throw new Error(\"Project file path must be relative and stay inside the project.\");\n }\n return readFile(resolve(project.root, relativePath), \"utf8\");\n}\n\nasync function handleRuntimeUpgrade(\n project: IgniteFuseProject,\n runtimeState: RuntimeState,\n mcpUrl: string,\n request: IncomingMessage,\n socket: RuntimeWebSocketClient[\"socket\"],\n) {\n const url = new URL(request.url ?? \"/\", `http://${request.headers.host ?? \"localhost\"}`);\n if (url.pathname !== \"/runtime\") {\n socket.destroy();\n return;\n }\n\n const key = request.headers[\"sec-websocket-key\"];\n if (typeof key !== \"string\") {\n socket.destroy();\n return;\n }\n\n const accept = createHash(\"sha1\")\n .update(`${key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`)\n .digest(\"base64\");\n\n socket.write([\n \"HTTP/1.1 101 Switching Protocols\",\n \"Upgrade: websocket\",\n \"Connection: Upgrade\",\n `Sec-WebSocket-Accept: ${accept}`,\n \"\\r\\n\",\n ].join(\"\\r\\n\"));\n\n const client: RuntimeWebSocketClient = {\n socket,\n send: (message) => socket.write(encodeWebSocketText(JSON.stringify(message))),\n };\n runtimeState.clients.add(client);\n\n client.send({ type: \"ready\", mcpUrl, project: projectResource(project) });\n\n socket.on(\"data\", (chunk: Buffer) => {\n for (const text of decodeWebSocketTextFrames(chunk)) {\n try {\n void handleRuntimeClientMessage(project, runtimeState, client, parseRuntimeClientMessage(text));\n } catch (error) {\n client.send({ type: \"error\", message: error instanceof Error ? error.message : String(error) });\n }\n }\n });\n socket.on(\"close\", () => runtimeState.clients.delete(client));\n socket.on(\"error\", () => runtimeState.clients.delete(client));\n}\n\nasync function handleRuntimeClientMessage(\n project: IgniteFuseProject,\n runtimeState: RuntimeState,\n client: RuntimeWebSocketClient,\n message: RuntimeClientMessage,\n) {\n try {\n if (message.type === \"readSource\") {\n client.send({ type: \"source\", id: message.id, ...(await sourceResource(project)) });\n return;\n }\n\n if (message.type === \"writeSource\") {\n if (typeof message.source !== \"string\") {\n throw new Error(\"writeSource requires source.\");\n }\n await writeFile(project.entryFile, message.source, \"utf8\");\n broadcastRuntime(runtimeState, { type: \"sourceChanged\", entry: project.config.entry, source: message.source });\n return;\n }\n\n if (message.type === \"run\") {\n const summary = await runProject(project, runtimeState, message, (progress) => {\n broadcastRuntime(runtimeState, { type: \"progress\", id: message.id, ...progress });\n });\n broadcastRuntime(runtimeState, { type: \"result\", id: message.id, summary });\n return;\n }\n\n if (message.type === \"cancel\") {\n client.send({ type: \"error\", id: message.id, message: \"Cancel is not implemented yet.\" });\n return;\n }\n\n throw new Error(`Unsupported runtime message: ${(message as { type?: string }).type}`);\n } catch (error) {\n client.send({ type: \"error\", id: message.id, message: error instanceof Error ? error.message : String(error) });\n }\n}\n\nfunction parseRuntimeClientMessage(text: string): RuntimeClientMessage {\n const message = JSON.parse(text) as RuntimeClientMessage;\n if (!message || typeof message.type !== \"string\") {\n throw new Error(\"Runtime WebSocket message requires a type.\");\n }\n return message;\n}\n\nfunction broadcastRuntime(runtimeState: RuntimeState, message: RuntimeServerMessage) {\n for (const client of runtimeState.clients) {\n client.send(message);\n }\n}\n\nfunction encodeWebSocketText(text: string) {\n const payload = Buffer.from(text, \"utf8\");\n if (payload.length < 126) {\n return Buffer.concat([Buffer.from([0x81, payload.length]), payload]);\n }\n if (payload.length <= 0xffff) {\n const header = Buffer.alloc(4);\n header[0] = 0x81;\n header[1] = 126;\n header.writeUInt16BE(payload.length, 2);\n return Buffer.concat([header, payload]);\n }\n const header = Buffer.alloc(10);\n header[0] = 0x81;\n header[1] = 127;\n header.writeBigUInt64BE(BigInt(payload.length), 2);\n return Buffer.concat([header, payload]);\n}\n\nfunction decodeWebSocketTextFrames(buffer: Buffer) {\n const messages: string[] = [];\n let offset = 0;\n\n while (offset + 2 <= buffer.length) {\n const first = buffer[offset++];\n const second = buffer[offset++];\n const opcode = first & 0x0f;\n const masked = (second & 0x80) !== 0;\n let length = second & 0x7f;\n\n if (length === 126) {\n if (offset + 2 > buffer.length) break;\n length = buffer.readUInt16BE(offset);\n offset += 2;\n } else if (length === 127) {\n if (offset + 8 > buffer.length) break;\n length = Number(buffer.readBigUInt64BE(offset));\n offset += 8;\n }\n\n const mask = masked ? buffer.subarray(offset, offset + 4) : undefined;\n if (masked) offset += 4;\n if (offset + length > buffer.length) break;\n\n const payload = Buffer.from(buffer.subarray(offset, offset + length));\n offset += length;\n\n if (opcode === 0x8) break;\n if (opcode !== 0x1) continue;\n\n if (mask) {\n for (let index = 0; index < payload.length; index += 1) {\n payload[index] ^= mask[index % 4];\n }\n }\n messages.push(payload.toString(\"utf8\"));\n }\n\n return messages;\n}\n\nasync function runProject(\n project: IgniteFuseProject,\n runtimeState: RuntimeState,\n args: Record<string, unknown>,\n onProgress?: (progress: { label: string; percent?: number; stage: RuntimeStage }) => void,\n) {\n const stage = typeof args.stage === \"string\" ? args.stage : \"toolpath\";\n if (!isRuntimeStage(stage)) {\n throw new Error(`Unsupported run stage: ${stage}`);\n }\n\n const result = await runRuntime(project, stage, onProgress);\n const toolpathSummary = result.graph ? await summarizeGraph(result.graph) : undefined;\n const summary = {\n diagnostics: result.diagnostics ?? [],\n hasGcodeExport: Boolean(result.hasGcodeExport),\n hasToolpathExport: Boolean(result.hasToolpathExport),\n message: `${stage} stage complete`,\n root: project.root,\n scene: result.scene,\n stats: result.graph?.stats ?? null,\n stage: result.stage ?? stage,\n status: \"success\",\n toolpath: toolpathSummary ? toolpathSummaryOnly(toolpathSummary) : undefined,\n updatedAt: Date.now(),\n };\n\n runtimeState.lastGraph = result.graph;\n runtimeState.lastResult = result;\n runtimeState.lastRunSummary = summary;\n runtimeState.lastToolpathSummary = toolpathSummary;\n\n return summary;\n}\n\nasync function runRuntime(\n project: IgniteFuseProject,\n stage: RuntimeStage,\n onProgress?: (progress: { label: string; percent?: number; stage: RuntimeStage }) => void,\n) {\n return runFuseScript({\n files: await readRuntimeFiles(project),\n mode: stage,\n onProgress,\n source: await readFile(project.entryFile, \"utf8\"),\n values: {},\n });\n}\n\nasync function summarizeGraph(graph: any) {\n return summarizeToolpathGraph(graph, { maxSampledPointsPerPath: 48 });\n}\n\nasync function readRuntimeFiles(project: IgniteFuseProject) {\n const files = new Map<string, Uint8Array>();\n const models = await modelsResource(project);\n for (const model of models.models) {\n files.set(model.path, await readFile(resolve(project.root, model.path)));\n }\n return files;\n}\n\nfunction isRuntimeStage(value: string): value is RuntimeStage {\n return value === \"scene\" || value === \"toolpath\" || value === \"gcode\";\n}\n\nfunction currentPrinterResource(runtimeState: RuntimeState) {\n const printer = runtimeState.lastResult?.scene?.printer ?? runtimeState.lastGraph?.printer ?? null;\n return printer ? { printer } : { printer: null, message: \"No CLI scene result has been recorded yet.\" };\n}\n\nfunction printerPresetsResource() {\n return {\n presets: Object.entries(printerPresets).map(([id, profile]) => ({ ...profile, id })),\n };\n}\n\nfunction filamentPresetsResource() {\n return {\n presets: Object.entries(filamentPresets).map(([id, profile]) => ({ ...profile, id })),\n };\n}\n\nfunction requireRunSummary(runtimeState: RuntimeState) {\n if (!runtimeState.lastRunSummary) {\n throw new Error(\"No CLI run result has been recorded yet.\");\n }\n return runtimeState.lastRunSummary;\n}\n\nfunction requireToolpathSummary(runtimeState: RuntimeState) {\n if (!runtimeState.lastToolpathSummary) {\n throw new Error(\"No CLI toolpath snapshot has been recorded yet.\");\n }\n return runtimeState.lastToolpathSummary;\n}\n\nfunction toolpathSummaryOnly(toolpath: any) {\n const { layers: _layers, ...summary } = toolpath;\n return summary;\n}\n\nfunction getToolpathLayer(\n runtimeState: RuntimeState,\n options: { includePoints?: boolean; layerIndex: number; maxPaths?: number; roles?: string[] },\n) {\n const toolpath = requireToolpathSummary(runtimeState);\n const layer = toolpath.layers?.find((candidate: any) => candidate.index === options.layerIndex);\n if (!layer) {\n throw new Error(`Toolpath layer not found: ${options.layerIndex}`);\n }\n\n const roles = options.roles && options.roles.length > 0 ? new Set(options.roles) : null;\n const maxPaths = Math.max(0, Math.floor(options.maxPaths ?? 200));\n const paths = (layer.paths ?? [])\n .filter((path: any) => !roles || roles.has(path.role))\n .slice(0, maxPaths)\n .map((path: any) => options.includePoints ? path : withoutSampledPoints(path));\n\n return {\n ...layer,\n paths,\n };\n}\n\nfunction getToolpathPath(\n runtimeState: RuntimeState,\n options: { includePoints?: boolean; layerIndex: number; pathId: string },\n) {\n const layer = getToolpathLayer(runtimeState, {\n includePoints: options.includePoints ?? true,\n layerIndex: options.layerIndex,\n maxPaths: Number.MAX_SAFE_INTEGER,\n });\n const path = layer.paths.find((candidate: any) => candidate.id === options.pathId);\n if (!path) {\n throw new Error(`Toolpath path not found: ${options.pathId}`);\n }\n return path;\n}\n\nfunction withoutSampledPoints(path: any) {\n const { sampledPoints: _sampledPoints, ...summary } = path;\n return summary;\n}\n\nfunction parseToolpathLayerUri(uri: string) {\n const url = new URL(uri.replace(\"ignitefuse://\", \"http://ignitefuse/\"));\n return {\n layerIndex: Number(url.pathname.replace(\"/toolpath-layer/\", \"\")),\n query: {\n includePoints: url.searchParams.get(\"includePoints\") === \"true\",\n maxPaths: url.searchParams.has(\"maxPaths\") ? Number(url.searchParams.get(\"maxPaths\")) : undefined,\n roles: url.searchParams.get(\"roles\")?.split(\",\").filter(Boolean),\n },\n };\n}\n\nfunction parseToolpathPathUri(uri: string) {\n const url = new URL(uri.replace(\"ignitefuse://\", \"http://ignitefuse/\"));\n const [_empty, _resource, layerIndex, pathId] = url.pathname.split(\"/\");\n return {\n layerIndex: Number(layerIndex),\n pathId: decodeURIComponent(pathId ?? \"\"),\n query: {\n includePoints: url.searchParams.get(\"includePoints\") !== \"false\",\n },\n };\n}\n\nfunction numberArg(value: unknown, name: string) {\n const number = Number(value);\n if (!Number.isFinite(number)) {\n throw new Error(`${name} must be a number.`);\n }\n return number;\n}\n\nfunction stringArg(value: unknown, name: string) {\n if (typeof value !== \"string\" || !value) {\n throw new Error(`${name} must be a string.`);\n }\n return value;\n}\n\nfunction mcpText(value: unknown) {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n };\n}\n\nfunction mcpJsonResource(uri: string, value: unknown) {\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(value, null, 2),\n },\n ],\n };\n}\n\nasync function readRequestBody(request: IncomingMessage) {\n return (await readRequestBytes(request)).toString(\"utf8\");\n}\n\nasync function readRequestBytes(request: IncomingMessage) {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nfunction setCorsHeaders(response: ServerResponse) {\n response.setHeader(\"access-control-allow-origin\", \"*\");\n response.setHeader(\"access-control-allow-headers\", \"content-type\");\n response.setHeader(\"access-control-allow-methods\", \"GET, POST, OPTIONS\");\n}\n\nfunction writeJson(response: ServerResponse, status: number, value: unknown) {\n response.writeHead(status, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify(value, null, 2));\n}\n\nfunction jsonRpcResult(id: JsonRpcId, result: unknown): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, result };\n}\n\nfunction jsonRpcError(id: JsonRpcId, code: number, message: string): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, error: { code, message } };\n}\n\ntype JsonRpcId = string | number;\n\ntype JsonRpcRequest = {\n id?: JsonRpcId | null;\n method: string;\n params?: Record<string, any>;\n};\n\ntype JsonRpcResponse = {\n jsonrpc: \"2.0\";\n id: JsonRpcId;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n };\n};\n\nmain(process.argv.slice(2)).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exitCode = 1;\n});\n", "{\n \"type\": \"abs\",\n \"diameter\": 1.75,\n \"flowRatio\": 1,\n \"nozzleTemp\": 245,\n \"bedTemp\": 100,\n \"cooling\": {\n \"maxFanSpeed\": 80,\n \"recommendedFanSpeed\": 0\n }\n}\n", "{\n \"type\": \"asa\",\n \"diameter\": 1.75,\n \"flowRatio\": 1,\n \"nozzleTemp\": 250,\n \"bedTemp\": 100,\n \"cooling\": {\n \"maxFanSpeed\": 80,\n \"recommendedFanSpeed\": 0\n }\n}\n", "{\n \"type\": \"petg\",\n \"diameter\": 1.75,\n \"flowRatio\": 1,\n \"nozzleTemp\": 235,\n \"bedTemp\": 75,\n \"cooling\": {\n \"bridgeFanSpeed\": 255,\n \"maxFanSpeed\": 180,\n \"recommendedFanSpeed\": 90\n }\n}\n", "{\n \"type\": \"pla\",\n \"diameter\": 1.75,\n \"flowRatio\": 1,\n \"nozzleTemp\": 210,\n \"bedTemp\": 60,\n \"cooling\": {\n \"bridgeFanSpeed\": 255,\n \"maxFanSpeed\": 255,\n \"recommendedFanSpeed\": 180\n }\n}\n", "{\n \"type\": \"tpu\",\n \"diameter\": 1.75,\n \"flowRatio\": 1,\n \"nozzleTemp\": 225,\n \"bedTemp\": 45,\n \"cooling\": {\n \"bridgeFanSpeed\": 200,\n \"maxFanSpeed\": 180,\n \"recommendedFanSpeed\": 120\n }\n}\n", "{\n \"id\": \"base-fdm\",\n \"name\": \"Generic FDM Base\",\n \"buildArea\": { \"x\": [0, 220], \"y\": [0, 220], \"z\": [0, 250] },\n \"machineFrame\": {\n \"origin\": [0, 0, 0],\n \"xAxis\": [1, 0, 0],\n \"yAxis\": [0, 1, 0],\n \"zAxis\": [0, 0, 1],\n \"bounds\": { \"x\": [0, 220], \"y\": [0, 220], \"z\": [0, 250] }\n },\n \"capabilities\": {\n \"heatedBed\": true,\n \"partCoolingFan\": true\n },\n \"filament\": 1.75,\n \"layerHeight\": 0.2,\n \"nozzle\": 0.4\n}\n", "{\n \"id\": \"base-bambu-fdm\",\n \"inherits\": \"base-fdm\",\n \"name\": \"Bambu Lab FDM Base\",\n \"capabilities\": {\n \"auxiliaryFan\": true,\n \"bedProbe\": true,\n \"supportsM73\": true\n },\n \"gcodeFlavor\": \"bambu\",\n \"gcodeStyle\": \"bambu\",\n \"gcodeScripts\": {\n \"layerChange\": [\n { \"line\": \"M73 L[layer_num+1]\", \"when\": { \"capability\": \"supportsM73\" } },\n { \"line\": \"M991 S0 P[layer_num] ;notify layer change\", \"when\": { \"capability\": \"supportsM73\" } }\n ],\n \"machinePause\": [\n \"M400 U1\"\n ]\n }\n}\n", "{\n \"id\": \"base-klipper-fdm\",\n \"inherits\": \"base-fdm\",\n \"name\": \"Klipper FDM Base\",\n \"capabilities\": {\n \"supportsExcludeObject\": true\n },\n \"gcodeFlavor\": \"klipper\",\n \"gcodeStyle\": \"orca\",\n \"gcodeScripts\": {\n \"machineStart\": [\n \";===== Klipper start (IgniteFuse) =====\",\n \"G90 ; absolute coordinates\",\n \"M83 ; relative extrusion\",\n { \"line\": \"M140 S[bed_temperature_initial_layer_single] ; set bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M104 S[nozzle_temperature_initial_layer] ; set nozzle temperature\",\n \"G28 ; home all axes\",\n { \"line\": \"M190 S[bed_temperature_initial_layer_single] ; wait for bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M109 S[nozzle_temperature_initial_layer] ; wait for nozzle temperature\",\n \"G92 E0 ; reset extrusion\"\n ],\n \"beforeLayerChange\": [\n \";BEFORE_LAYER_CHANGE\",\n \";[layer_z]\",\n \"G92 E0\"\n ],\n \"layerChange\": [\n \";AFTER_LAYER_CHANGE\",\n \";[layer_z]\"\n ],\n \"machineEnd\": [\n \";===== Klipper end (IgniteFuse) =====\",\n \"M400 ; wait for moves\",\n \"G92 E0\",\n \"G1 E-0.8 F1800 ; retract\",\n { \"line\": \"M107 ; fan off\", \"when\": { \"capability\": \"partCoolingFan\" } },\n \"M104 S0 ; hotend off\",\n { \"line\": \"M140 S0 ; bed off\", \"when\": { \"capability\": \"heatedBed\" } },\n \"G91 ; relative positioning\",\n \"G0 Z10 F1200 ; lift\",\n \"G90 ; absolute positioning\",\n \"M84 ; motors off\"\n ],\n \"machinePause\": [\n \"PAUSE\"\n ]\n }\n}\n", "{\n \"id\": \"base-marlin-fdm\",\n \"inherits\": \"base-fdm\",\n \"name\": \"Marlin FDM Base\",\n \"gcodeFlavor\": \"marlin\",\n \"gcodeStyle\": \"orca\"\n}\n", "{\n \"id\": \"base-prusa-fdm\",\n \"inherits\": \"base-marlin-fdm\",\n \"name\": \"Prusa FDM Base\",\n \"capabilities\": {\n \"bedProbe\": true,\n \"supportsM486\": true\n },\n \"gcodeStyle\": \"prusa\"\n}\n", "{\n \"id\": \"bambu-a1-mini\",\n \"inherits\": \"base-bambu-fdm\",\n \"name\": \"Bambu Lab A1 mini\",\n \"buildArea\": { \"x\": [0, 180], \"y\": [0, 180], \"z\": [0, 180] },\n \"machineFrame\": {\n \"origin\": [0, 0, 0],\n \"xAxis\": [1, 0, 0],\n \"yAxis\": [0, 1, 0],\n \"zAxis\": [0, 0, 1],\n \"bounds\": { \"x\": [0, 180], \"y\": [0, 180], \"z\": [0, 180] }\n },\n \"gcodeScripts\": {\n \"machineStart\": [\n \";===== machine: Bambu Lab A1 mini (IgniteFuse) =====\",\n \"M1002 gcode_claim_action : 2\",\n \"M1002 set_filament_type:[filament_type]\",\n \"M104 S170 ; preheat nozzle\",\n { \"line\": \"M140 S[bed_temperature_initial_layer_single] ; set bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"G392 S0 ; turn off clog detect during preparation\",\n \"M17\",\n \"M400 S1\",\n \"G90\",\n \"M83\",\n \"M220 S100 ; reset feedrate\",\n \"M221 S100 ; reset flowrate\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n \"G28 ; home all axes\",\n { \"line\": \"M190 S[bed_temperature_initial_layer_single] ; wait for bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M109 S[nozzle_temperature_initial_layer] ; wait for nozzle temperature\",\n \"M1002 gcode_claim_action : 1\",\n { \"line\": \"G29 A1 X[first_layer_print_min_x] Y[first_layer_print_min_y] I[first_layer_print_size_x] J[first_layer_print_size_y] ; bed leveling\", \"when\": { \"capability\": \"bedProbe\" } },\n \"M400\",\n \"M1002 gcode_claim_action : 0\",\n \"M1007 S1\",\n \"G92 E0\",\n \"G1 X-13.5 Y0 Z10 F10000 ; move to purge side\",\n \"G1 E1.2 F500\",\n \"G1 X18 Y1 Z0.3 F18000\",\n \"G1 X80 E8 F900 ; purge line\",\n \"G92 E0\"\n ],\n \"machineEnd\": [\n \";===== Bambu A1 mini end (IgniteFuse) =====\",\n \"G392 S0 ; turn off clog detect\",\n \"M400 ; wait for buffer to clear\",\n \"G92 E0\",\n \"G1 E-0.8 F1800 ; retract\",\n \"G1 Z{max_layer_z + 0.5} F900 ; lift\",\n \"G1 X0 Y180 F18000 ; move to safe pos\",\n { \"line\": \"M140 S0 ; turn off bed\", \"when\": { \"capability\": \"heatedBed\" } },\n { \"line\": \"M106 S0 ; turn off fan\", \"when\": { \"capability\": \"partCoolingFan\" } },\n { \"line\": \"M106 P2 S0 ; turn off remote part cooling fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n { \"line\": \"M106 P3 S0 ; turn off chamber cooling fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n \"M104 S0 ; turn off hotend\",\n \"M400\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n \"M1002 set_gcode_claim_speed_level : 0\",\n \"M18 X Y Z\"\n ]\n }\n}\n", "{\n \"id\": \"bambu-a1\",\n \"inherits\": \"base-bambu-fdm\",\n \"name\": \"Bambu Lab A1\",\n \"buildArea\": { \"x\": [0, 256], \"y\": [0, 256], \"z\": [0, 256] },\n \"machineFrame\": {\n \"origin\": [0, 0, 0],\n \"xAxis\": [1, 0, 0],\n \"yAxis\": [0, 1, 0],\n \"zAxis\": [0, 0, 1],\n \"bounds\": { \"x\": [0, 256], \"y\": [0, 256], \"z\": [0, 256] }\n },\n \"gcodeScripts\": {\n \"machineStart\": [\n \";===== machine: Bambu Lab A1 (IgniteFuse) =====\",\n \"M1002 gcode_claim_action : 2\",\n \"M1002 set_filament_type:[filament_type]\",\n \"M104 S170 ; preheat nozzle\",\n { \"line\": \"M140 S[bed_temperature_initial_layer_single] ; set bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"G392 S0 ; turn off clog detect during preparation\",\n \"M17\",\n \"M400 S1\",\n \"G90\",\n \"M83\",\n \"M220 S100 ; reset feedrate\",\n \"M221 S100 ; reset flowrate\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n \"G28 ; home all axes\",\n { \"line\": \"M190 S[bed_temperature_initial_layer_single] ; wait for bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M109 S[nozzle_temperature_initial_layer] ; wait for nozzle temperature\",\n \"M1002 gcode_claim_action : 1\",\n { \"line\": \"G29 A1 X[first_layer_print_min_x] Y[first_layer_print_min_y] I[first_layer_print_size_x] J[first_layer_print_size_y] ; bed leveling\", \"when\": { \"capability\": \"bedProbe\" } },\n \"M400\",\n \"M1002 gcode_claim_action : 0\",\n \"M1007 S1\",\n \"G92 E0\",\n \"G1 X-13.5 Y0 Z10 F10000 ; move to purge side\",\n \"G1 E1.2 F500\",\n \"G1 X18 Y1 Z0.3 F18000\",\n \"G1 X120 E12 F900 ; purge line\",\n \"G92 E0\"\n ],\n \"machineEnd\": [\n \";===== Bambu A1 end (IgniteFuse) =====\",\n \"G392 S0 ; turn off clog detect\",\n \"M400 ; wait for buffer to clear\",\n \"G92 E0\",\n \"G1 E-0.8 F1800 ; retract\",\n \"G1 Z{max_layer_z + 0.5} F900 ; lift\",\n \"G1 X0 Y220 F18000 ; move to safe pos\",\n { \"line\": \"M140 S0 ; turn off bed\", \"when\": { \"capability\": \"heatedBed\" } },\n { \"line\": \"M106 S0 ; turn off fan\", \"when\": { \"capability\": \"partCoolingFan\" } },\n { \"line\": \"M106 P2 S0 ; turn off remote part cooling fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n { \"line\": \"M106 P3 S0 ; turn off chamber cooling fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n \"M104 S0 ; turn off hotend\",\n \"M400\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n \"M1002 set_gcode_claim_speed_level : 0\",\n \"M18 X Y Z\"\n ]\n }\n}\n", "{\n \"id\": \"bambu-p1s\",\n \"inherits\": \"base-bambu-fdm\",\n \"name\": \"Bambu Lab P1S\",\n \"buildArea\": { \"x\": [0, 256], \"y\": [0, 256], \"z\": [0, 256] },\n \"machineFrame\": {\n \"origin\": [0, 0, 0],\n \"xAxis\": [1, 0, 0],\n \"yAxis\": [0, 1, 0],\n \"zAxis\": [0, 0, 1],\n \"bounds\": { \"x\": [0, 256], \"y\": [0, 256], \"z\": [0, 256] }\n },\n \"capabilities\": {\n \"heatedChamber\": false\n },\n \"gcodeScripts\": {\n \"machineStart\": [\n \";===== machine: Bambu Lab P1S (IgniteFuse) =====\",\n \"M1002 gcode_claim_action : 2\",\n \"M104 S170 ; preheat nozzle\",\n { \"line\": \"M140 S[bed_temperature_initial_layer_single] ; set bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M17\",\n \"G90\",\n \"M83\",\n \"M220 S100 ; reset feedrate\",\n \"M221 S100 ; reset flowrate\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n { \"line\": \"M190 S[bed_temperature_initial_layer_single] ; wait for bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M104 S[nozzle_temperature_initial_layer] ; set nozzle temperature\",\n \"G28 ; home all axes\",\n { \"line\": \"G29 A X[first_layer_print_min_x] Y[first_layer_print_min_y] I[first_layer_print_size_x] J[first_layer_print_size_y] ; bed leveling\", \"when\": { \"capability\": \"bedProbe\" } },\n \"M109 S[nozzle_temperature_initial_layer] ; wait for nozzle temperature\",\n \"M400\",\n \"M1002 gcode_claim_action : 0\",\n \"G92 E0\",\n \"G1 X18 Y1 Z0.3 F18000\",\n \"G1 X220 E15 F900 ; purge line\",\n \"G92 E0\"\n ],\n \"machineEnd\": [\n \";===== Bambu P1S end (IgniteFuse) =====\",\n \"M400 ; wait for buffer to clear\",\n \"G92 E0\",\n \"G1 E-0.8 F1800 ; retract\",\n \"G1 Z{max_layer_z + 0.5} F900 ; lift\",\n \"G1 X65 Y245 F12000 ; move to safe pos\",\n { \"line\": \"M140 S0 ; turn off bed\", \"when\": { \"capability\": \"heatedBed\" } },\n { \"line\": \"M106 S0 ; turn off fan\", \"when\": { \"capability\": \"partCoolingFan\" } },\n { \"line\": \"M106 P2 S0 ; turn off auxiliary fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n { \"line\": \"M106 P3 S0 ; turn off chamber fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n \"M104 S0 ; turn off hotend\",\n \"M400\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n \"M1002 set_gcode_claim_speed_level : 0\"\n ]\n }\n}\n", "{\n \"id\": \"bambu-x1c\",\n \"inherits\": \"base-bambu-fdm\",\n \"name\": \"Bambu Lab X1 Carbon\",\n \"buildArea\": { \"x\": [0, 256], \"y\": [0, 256], \"z\": [0, 256] },\n \"machineFrame\": {\n \"origin\": [0, 0, 0],\n \"xAxis\": [1, 0, 0],\n \"yAxis\": [0, 1, 0],\n \"zAxis\": [0, 0, 1],\n \"bounds\": { \"x\": [0, 256], \"y\": [0, 256], \"z\": [0, 256] }\n },\n \"capabilities\": {\n \"chamberLight\": true,\n \"heatedChamber\": true\n },\n \"gcodeScripts\": {\n \"machineStart\": [\n \";===== machine: Bambu Lab X1 Carbon (IgniteFuse) =====\",\n \"M1002 gcode_claim_action : 2\",\n \"M104 S170 ; preheat nozzle\",\n { \"line\": \"M140 S[bed_temperature_initial_layer_single] ; set bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M17\",\n \"G90\",\n \"M83\",\n \"M220 S100 ; reset feedrate\",\n \"M221 S100 ; reset flowrate\",\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n { \"line\": \"M190 S[bed_temperature_initial_layer_single] ; wait for bed temperature\", \"when\": { \"capability\": \"heatedBed\" } },\n \"M104 S[nozzle_temperature_initial_layer] ; set nozzle temperature\",\n \"G28 ; home all axes\",\n { \"line\": \"G29 A X[first_layer_print_min_x] Y[first_layer_print_min_y] I[first_layer_print_size_x] J[first_layer_print_size_y] ; bed leveling\", \"when\": { \"capability\": \"bedProbe\" } },\n \"M109 S[nozzle_temperature_initial_layer] ; wait for nozzle temperature\",\n \"M400\",\n \"M1002 gcode_claim_action : 0\",\n \"G92 E0\",\n \"G1 X18 Y1 Z0.3 F18000\",\n \"G1 X220 E15 F900 ; purge line\",\n \"G92 E0\"\n ],\n \"machineEnd\": [\n \";===== Bambu X1 Carbon end (IgniteFuse) =====\",\n \"M400 ; wait for buffer to clear\",\n \"G92 E0\",\n \"G1 E-0.8 F1800 ; retract\",\n \"G1 Z{max_layer_z + 0.5} F900 ; lift\",\n \"G1 X65 Y245 F12000 ; move to safe pos\",\n { \"line\": \"M140 S0 ; turn off bed\", \"when\": { \"capability\": \"heatedBed\" } },\n { \"line\": \"M106 S0 ; turn off fan\", \"when\": { \"capability\": \"partCoolingFan\" } },\n { \"line\": \"M106 P2 S0 ; turn off auxiliary fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n { \"line\": \"M106 P3 S0 ; turn off chamber fan\", \"when\": { \"capability\": \"auxiliaryFan\" } },\n \"M104 S0 ; turn off hotend\",\n \"M400\",\n { \"line\": \"M960 S5 P0 ; turn off logo lamp\", \"when\": { \"capability\": \"chamberLight\" } },\n { \"line\": \"M73.2 R1.0 ; reset remaining time multiplier\", \"when\": { \"capability\": \"supportsM73\" } },\n \"M1002 set_gcode_claim_speed_level : 0\"\n ]\n }\n}\n", "{\n \"id\": \"generic-klipper\",\n \"inherits\": \"base-klipper-fdm\",\n \"name\": \"Generic Klipper FDM 220\"\n}\n", "{\n \"id\": \"generic-marlin\",\n \"inherits\": \"base-marlin-fdm\",\n \"name\": \"Generic Marlin FDM 220\"\n}\n", "{\n \"id\": \"prusa-mk4\",\n \"inherits\": \"base-prusa-fdm\",\n \"name\": \"Prusa MK4\",\n \"buildArea\": { \"x\": [0, 220], \"y\": [0, 220], \"z\": [0, 250] },\n \"machineFrame\": {\n \"origin\": [0, 0, 0],\n \"xAxis\": [1, 0, 0],\n \"yAxis\": [0, 1, 0],\n \"zAxis\": [0, 0, 1]\n },\n \"capabilities\": {\n \"bedProbe\": true,\n \"supportsM486\": true\n }\n}\n", "export type PresetKind = \"printer\" | \"filament\";\n\nexport type Vec3 = [number, number, number];\nexport type PrinterAxisRange = [number, number];\n\nexport type PrinterBounds = {\n x: PrinterAxisRange;\n y: PrinterAxisRange;\n z: PrinterAxisRange;\n};\n\nexport type PrinterMachineFrame = {\n origin: Vec3;\n xAxis: Vec3;\n yAxis: Vec3;\n zAxis: Vec3;\n bounds?: PrinterBounds;\n};\n\nexport type PrinterCapabilities = {\n heatedBed: boolean;\n auxiliaryFan?: boolean;\n chamberLight?: boolean;\n heatedChamber?: boolean;\n partCoolingFan?: boolean;\n bedProbe?: boolean;\n filamentRunoutSensor?: boolean;\n multiMaterial?: boolean;\n ams?: boolean;\n supportsM73?: boolean;\n supportsM486?: boolean;\n supportsExcludeObject?: boolean;\n};\n\nexport type PrinterDefaults = {\n bedTemp?: number;\n chamberTemp?: number;\n filamentDiameter?: number;\n firstLayerSpeed?: number;\n nozzleDiameter?: number;\n nozzleTemp?: number;\n purgeLine?: boolean;\n travelSpeed?: number;\n};\n\nexport type GcodeScriptCondition = {\n allCapabilities?: Array<keyof PrinterCapabilities>;\n anyCapabilities?: Array<keyof PrinterCapabilities>;\n capability?: keyof PrinterCapabilities;\n notCapability?: keyof PrinterCapabilities;\n};\n\nexport type GcodeScriptLine =\n | string\n | {\n line: string;\n when?: GcodeScriptCondition;\n };\n\nexport type GcodeScriptLines = string | GcodeScriptLine[];\n\nexport type GcodeScripts = {\n beforeLayerChange?: GcodeScriptLines;\n changeFilament?: GcodeScriptLines;\n filamentEnd?: GcodeScriptLines;\n filamentStart?: GcodeScriptLines;\n layerChange?: GcodeScriptLines;\n machineEnd?: GcodeScriptLines;\n machinePause?: GcodeScriptLines;\n machineStart?: GcodeScriptLines;\n objectEnd?: GcodeScriptLines;\n objectStart?: GcodeScriptLines;\n timeLapse?: GcodeScriptLines;\n};\n\nexport type PrinterProcess = {\n direction?: Vec3;\n gravity?: Vec3;\n};\n\nexport type PrinterCoordinates = {\n machineFrame?: PrinterMachineFrame;\n};\n\nexport type PrinterProfile = {\n buildArea?: PrinterBounds;\n capabilities?: PrinterCapabilities;\n coordinates?: PrinterCoordinates;\n machineFrame?: PrinterMachineFrame;\n defaults?: PrinterDefaults;\n filament: number;\n gcodeFlavor?: string;\n gcodeScripts?: GcodeScripts;\n gcodeStyle?: string;\n layerHeight: number;\n name?: string;\n nozzle: number;\n process?: PrinterProcess;\n};\n\nexport type FilamentProfile = {\n bedTemp?: number;\n chamberTemp?: number;\n cooling?: {\n bridgeFanSpeed?: number;\n maxFanSpeed?: number;\n recommendedFanSpeed?: number;\n };\n diameter?: number;\n flowRatio?: number;\n nozzleTemp?: number;\n type?: string;\n};\n\nimport absFilament from \"./filaments/abs.json\";\nimport asaFilament from \"./filaments/asa.json\";\nimport petgFilament from \"./filaments/petg.json\";\nimport plaFilament from \"./filaments/pla.json\";\nimport tpuFilament from \"./filaments/tpu.json\";\nimport fdmBasePrinter from \"./printers/base-fdm.json\";\nimport bambuFdmBasePrinter from \"./printers/base-bambu-fdm.json\";\nimport klipperFdmBasePrinter from \"./printers/base-klipper-fdm.json\";\nimport marlinFdmBasePrinter from \"./printers/base-marlin-fdm.json\";\nimport prusaFdmBasePrinter from \"./printers/base-prusa-fdm.json\";\nimport bambuA1MiniPrinter from \"./printers/bambu-a1-mini.json\";\nimport bambuA1Printer from \"./printers/bambu-a1.json\";\nimport bambuP1sPrinter from \"./printers/bambu-p1s.json\";\nimport bambuX1cPrinter from \"./printers/bambu-x1c.json\";\nimport genericKlipperPrinter from \"./printers/generic-klipper.json\";\nimport genericMarlinPrinter from \"./printers/generic-marlin.json\";\nimport prusaMk4Printer from \"./printers/prusa-mk4.json\";\n\nexport const defaultPrinterCapabilities: PrinterCapabilities = {\n heatedBed: true,\n partCoolingFan: true,\n};\n\ntype RawPrinterPreset = Omit<Partial<PrinterProfile>, \"capabilities\"> & {\n capabilities?: Partial<PrinterCapabilities>;\n id?: string;\n inherits?: string;\n};\n\nconst rawPrinterPresets: Record<string, RawPrinterPreset> = {\n \"base-fdm\": fdmBasePrinter as unknown as RawPrinterPreset,\n \"base-bambu-fdm\": bambuFdmBasePrinter as unknown as RawPrinterPreset,\n \"base-klipper-fdm\": klipperFdmBasePrinter as unknown as RawPrinterPreset,\n \"base-marlin-fdm\": marlinFdmBasePrinter as unknown as RawPrinterPreset,\n \"base-prusa-fdm\": prusaFdmBasePrinter as unknown as RawPrinterPreset,\n \"generic-marlin\": genericMarlinPrinter as unknown as RawPrinterPreset,\n \"generic-klipper\": genericKlipperPrinter as unknown as RawPrinterPreset,\n \"bambu-a1-mini\": bambuA1MiniPrinter as unknown as RawPrinterPreset,\n \"bambu-a1\": bambuA1Printer as unknown as RawPrinterPreset,\n \"bambu-p1s\": bambuP1sPrinter as unknown as RawPrinterPreset,\n \"bambu-x1c\": bambuX1cPrinter as unknown as RawPrinterPreset,\n \"prusa-mk4\": prusaMk4Printer as unknown as RawPrinterPreset,\n};\n\nconst visiblePrinterPresetIds = [\n \"generic-marlin\",\n \"generic-klipper\",\n \"bambu-a1-mini\",\n \"bambu-a1\",\n \"bambu-p1s\",\n \"bambu-x1c\",\n \"prusa-mk4\",\n];\n\nexport const filamentPresets: Record<string, FilamentProfile> = {\n abs: absFilament,\n asa: asaFilament,\n petg: petgFilament,\n pla: plaFilament,\n tpu: tpuFilament,\n};\n\nconst mergePrinterPreset = (base: RawPrinterPreset, override: RawPrinterPreset): RawPrinterPreset => {\n const { inherits: _baseInherits, ...baseProfile } = base;\n const { inherits: _overrideInherits, ...overrideProfile } = override;\n const merged: RawPrinterPreset = {\n ...baseProfile,\n ...overrideProfile,\n capabilities: {\n ...base.capabilities,\n ...override.capabilities,\n },\n defaults: {\n ...base.defaults,\n ...override.defaults,\n },\n gcodeScripts: {\n ...base.gcodeScripts,\n ...override.gcodeScripts,\n },\n machineFrame: override.machineFrame ?? base.machineFrame,\n };\n if (base.process || override.process) {\n merged.process = {\n ...base.process,\n ...override.process,\n };\n }\n return merged;\n};\n\nconst resolvePrinterPreset = (id: string, stack: string[] = []): PrinterProfile => {\n const raw = rawPrinterPresets[id] ?? rawPrinterPresets[\"generic-marlin\"];\n if (!raw) throw new Error(`Unknown printer preset: ${id}`);\n if (stack.includes(id)) throw new Error(`Circular printer preset inheritance: ${[...stack, id].join(\" -> \")}`);\n const inherited = raw.inherits ? resolvePrinterPreset(raw.inherits, [...stack, id]) : {};\n return mergePrinterPreset(inherited, raw) as PrinterProfile;\n};\n\nexport const validatePrinterPreset = (profile: PrinterProfile) => {\n const diagnostics: string[] = [];\n if (!profile.buildArea) diagnostics.push(\"buildArea is missing.\");\n if (!profile.machineFrame) diagnostics.push(\"machineFrame is missing.\");\n if (!Number.isFinite(profile.nozzle) || profile.nozzle <= 0) diagnostics.push(\"nozzle must be positive.\");\n if (!Number.isFinite(profile.filament) || profile.filament <= 0) diagnostics.push(\"filament must be positive.\");\n if (!Number.isFinite(profile.layerHeight) || profile.layerHeight <= 0) diagnostics.push(\"layerHeight must be positive.\");\n const frame = profile.machineFrame;\n if (frame) {\n const determinant =\n frame.xAxis[0] * (frame.yAxis[1] * frame.zAxis[2] - frame.yAxis[2] * frame.zAxis[1]) -\n frame.yAxis[0] * (frame.xAxis[1] * frame.zAxis[2] - frame.xAxis[2] * frame.zAxis[1]) +\n frame.zAxis[0] * (frame.xAxis[1] * frame.yAxis[2] - frame.xAxis[2] * frame.yAxis[1]);\n if (!Number.isFinite(determinant) || Math.abs(determinant) < 1e-9) diagnostics.push(\"machineFrame basis must be invertible.\");\n }\n return diagnostics;\n};\n\nconst checkedPrinterPreset = (id: string) => {\n const profile = resolvePrinterPreset(id);\n const diagnostics = validatePrinterPreset(profile);\n if (diagnostics.length > 0) {\n throw new Error(`Invalid printer preset ${id}: ${diagnostics.join(\" \")}`);\n }\n return profile;\n};\n\nexport const defaultGcodePrinter = checkedPrinterPreset(\"generic-marlin\");\n\nexport const printerPresets: Record<string, PrinterProfile> = Object.fromEntries(\n visiblePrinterPresetIds.map((id) => [id, checkedPrinterPreset(id)]),\n) as Record<string, PrinterProfile>;\n\nexport const preset = (id: string, overrides: Partial<PrinterProfile> = {}): PrinterProfile => {\n const base = resolvePrinterPreset(id);\n return {\n ...base,\n ...overrides,\n capabilities: {\n ...defaultPrinterCapabilities,\n ...base.capabilities,\n ...overrides.capabilities,\n },\n defaults: {\n ...base.defaults,\n ...overrides.defaults,\n },\n gcodeScripts: {\n ...base.gcodeScripts,\n ...overrides.gcodeScripts,\n },\n machineFrame: overrides.machineFrame ?? base.machineFrame,\n };\n};\n\nexport const filament = (id: string, overrides: FilamentProfile = {}): FilamentProfile => ({\n ...(filamentPresets[id] ?? { diameter: 1.75, flowRatio: 1, type: id }),\n ...overrides,\n cooling: {\n ...(filamentPresets[id]?.cooling ?? {}),\n ...overrides.cooling,\n },\n});\n", "import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nexport type IgniteFuseProjectConfig = {\n name: string;\n entry: string;\n modelsDir?: string;\n outputDir?: string;\n version?: number;\n models?: Array<{ path: string; kind?: string }>;\n active_model?: string;\n};\n\nexport type IgniteFuseProject = {\n root: string;\n configPath: string;\n entryFile: string;\n modelsDir: string;\n outputDir: string;\n config: IgniteFuseProjectConfig;\n};\n\nconst CONFIG_FILE = \"ignitefuse.json\";\nconst DEFAULT_ENTRY_FILE = \"main.fuse.js\";\nconst DEFAULT_MODELS_DIR = \"models\";\nconst DEFAULT_OUTPUT_DIR = \"output\";\n\nexport async function createIgniteFuseProject(targetDir: string): Promise<IgniteFuseProject> {\n const root = resolve(targetDir);\n const config: IgniteFuseProjectConfig = {\n name: basename(root),\n entry: DEFAULT_ENTRY_FILE,\n modelsDir: DEFAULT_MODELS_DIR,\n outputDir: DEFAULT_OUTPUT_DIR,\n };\n\n const project = resolveIgniteFuseProject(root, config);\n await mkdir(project.modelsDir, { recursive: true });\n await mkdir(project.outputDir, { recursive: true });\n await writeIfMissing(join(root, CONFIG_FILE), `${JSON.stringify(config, null, 2)}\\n`);\n await writeIfMissing(project.entryFile, defaultFuseSource(config.name));\n\n return project;\n}\n\nexport async function findIgniteFuseProject(startPath: string): Promise<IgniteFuseProject> {\n const root = await findProjectRoot(resolve(startPath));\n const configPath = join(root, CONFIG_FILE);\n const rawConfig = await readFile(configPath, \"utf8\");\n const config = JSON.parse(rawConfig) as IgniteFuseProjectConfig;\n return resolveIgniteFuseProject(root, config);\n}\n\nasync function findProjectRoot(startPath: string): Promise<string> {\n let current = startPath;\n\n while (true) {\n if (await exists(join(current, CONFIG_FILE))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n throw new Error(`IgniteFuse project not found from ${startPath}`);\n }\n current = parent;\n }\n}\n\nfunction resolveIgniteFuseProject(root: string, config: IgniteFuseProjectConfig): IgniteFuseProject {\n const normalizedConfig: IgniteFuseProjectConfig = {\n ...config,\n name: config.name ?? basename(root),\n entry: config.entry ?? DEFAULT_ENTRY_FILE,\n modelsDir: config.modelsDir ?? DEFAULT_MODELS_DIR,\n outputDir: config.outputDir ?? DEFAULT_OUTPUT_DIR,\n };\n\n return {\n root,\n configPath: join(root, CONFIG_FILE),\n entryFile: join(root, normalizedConfig.entry),\n modelsDir: join(root, normalizedConfig.modelsDir ?? DEFAULT_MODELS_DIR),\n outputDir: join(root, normalizedConfig.outputDir ?? DEFAULT_OUTPUT_DIR),\n config: normalizedConfig,\n };\n}\n\nasync function writeIfMissing(path: string, contents: string) {\n if (await exists(path)) {\n return;\n }\n await writeFile(path, contents, \"utf8\");\n}\n\nasync function exists(path: string) {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction defaultFuseSource(projectName: string) {\n return `const machine = printer({\n name: \"Generic FDM 220\",\n buildArea: { x: [0, 220], y: [0, 220], z: [0, 250] },\n machineFrame: {\n origin: [0, 0, 0],\n xAxis: [1, 0, 0],\n yAxis: [0, 1, 0],\n zAxis: [0, 0, 1],\n },\n nozzle: 0.4,\n filament: 1.75,\n gcodeFlavor: \"marlin\",\n});\n\nexportScene({\n printer: machine,\n items: [],\n});\n\nexportToolpath(async () => {\n const graph = toolpath({ printer: machine, layerHeight: 0.2 });\n return graph;\n});\n\nonExportGcode(({ graph, generateGcode }) => {\n return generateGcode(graph, {\n output: { flavor: \"marlin\" },\n filament: { nozzleTemp: 210, bedTemp: 60 },\n });\n});\n`;\n}\n", "export type GcodeLineMapper = (\n line: string,\n index: number,\n lines: readonly string[],\n) => string | string[] | null | undefined;\n\nexport type GcodeEditor = {\n append: (lines: string | string[]) => GcodeEditor;\n insertBeforeEnd: (lines: string | string[]) => GcodeEditor;\n mapLines: (mapper: GcodeLineMapper) => GcodeEditor;\n prepend: (lines: string | string[]) => GcodeEditor;\n replace: (pattern: RegExp | string, replacement: string) => GcodeEditor;\n toLines: () => string[];\n toString: () => string;\n};\n\nconst splitGcode = (source: string) => source.replaceAll(\"\\r\\n\", \"\\n\").replace(/\\n+$/, \"\").split(\"\\n\");\n\nconst normalizeLines = (lines: string | string[]) => (Array.isArray(lines) ? lines : splitGcode(lines));\n\nconst lastNonEmptyLineIndex = (lines: string[]) => {\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n if (lines[index].trim()) return index;\n }\n\n return lines.length;\n};\n\nexport const editGcode = (source: string | string[]): GcodeEditor => {\n const lines = normalizeLines(source);\n const create = (nextLines: string[]) => editGcode(nextLines);\n\n return {\n append: (additionalLines) => create([...lines, ...normalizeLines(additionalLines)]),\n insertBeforeEnd: (insertedLines) => {\n const index = lastNonEmptyLineIndex(lines);\n return create([...lines.slice(0, index), ...normalizeLines(insertedLines), ...lines.slice(index)]);\n },\n mapLines: (mapper) => {\n const mappedLines = lines.flatMap((line, index) => {\n const mapped = mapper(line, index, lines);\n if (mapped === null) return [];\n if (typeof mapped === \"undefined\") return [line];\n return Array.isArray(mapped) ? mapped : [mapped];\n });\n\n return create(mappedLines);\n },\n prepend: (additionalLines) => create([...normalizeLines(additionalLines), ...lines]),\n replace: (pattern, replacement) => create(lines.map((line) => line.replace(pattern, replacement))),\n toLines: () => [...lines],\n toString: () => `${lines.join(\"\\n\")}\\n`,\n };\n};\n", "import type { Vec3 } from \"./types\";\n\nexport const add3 = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n\nexport const sub3 = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n\nexport const scale3 = (value: Vec3, scale: number): Vec3 => [\n value[0] * scale,\n value[1] * scale,\n value[2] * scale,\n];\n\nexport const dot3 = (a: Vec3, b: Vec3) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n\nexport const cross3 = (a: Vec3, b: Vec3): Vec3 => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\n\nexport const length3 = (value: Vec3) => Math.sqrt(dot3(value, value));\n\nexport const normalize3 = (value: Vec3): Vec3 => {\n const length = length3(value);\n\n if (length === 0) {\n return [0, 0, 0];\n }\n\n return scale3(value, 1 / length);\n};\n", "import type { Vec3 } from \"../geometry/types\";\nimport { add3, cross3, dot3, normalize3, scale3, sub3 } from \"../geometry/vector\";\nimport type { Frame3 } from \"../geometry/types\";\nimport type { PrinterMachineFrame, ToolpathPath, ToolpathPoint } from \"./types\";\n\nexport const defaultMachineFrame: PrinterMachineFrame = {\n origin: [0, 0, 0],\n xAxis: [1, 0, 0],\n yAxis: [0, 1, 0],\n zAxis: [0, 0, 1],\n};\n\nconst tuple3 = (value: unknown, fallback: Vec3): Vec3 => {\n if (!Array.isArray(value)) return fallback;\n\n return [\n Number.isFinite(Number(value[0])) ? Number(value[0]) : fallback[0],\n Number.isFinite(Number(value[1])) ? Number(value[1]) : fallback[1],\n Number.isFinite(Number(value[2])) ? Number(value[2]) : fallback[2],\n ];\n};\n\nexport const normalizeMachineFrame = (frame?: Partial<PrinterMachineFrame>): PrinterMachineFrame => ({\n bounds: frame?.bounds,\n origin: tuple3(frame?.origin, defaultMachineFrame.origin),\n xAxis: tuple3(frame?.xAxis, defaultMachineFrame.xAxis),\n yAxis: tuple3(frame?.yAxis, defaultMachineFrame.yAxis),\n zAxis: tuple3(frame?.zAxis, defaultMachineFrame.zAxis),\n});\n\nconst invertBasis = (frame: PrinterMachineFrame) => {\n const [\n [a, b, c],\n [d, e, f],\n [g, h, i],\n ] = [\n [frame.xAxis[0], frame.yAxis[0], frame.zAxis[0]],\n [frame.xAxis[1], frame.yAxis[1], frame.zAxis[1]],\n [frame.xAxis[2], frame.yAxis[2], frame.zAxis[2]],\n ];\n const determinant = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);\n\n if (Math.abs(determinant) < 1e-12) {\n throw new Error(\"printer.machineFrame axes must form an invertible basis.\");\n }\n\n const invDet = 1 / determinant;\n\n return [\n [(e * i - f * h) * invDet, (c * h - b * i) * invDet, (b * f - c * e) * invDet],\n [(f * g - d * i) * invDet, (a * i - c * g) * invDet, (c * d - a * f) * invDet],\n [(d * h - e * g) * invDet, (b * g - a * h) * invDet, (a * e - b * d) * invDet],\n ] as const;\n};\n\nexport const buildPointToMachineInFrame = (point: ToolpathPoint | { x: number; y: number; z: number }, machineFrame: PrinterMachineFrame): ToolpathPoint => {\n const buildPoint: Vec3 = [point.x, point.y, point.z];\n const relative = sub3(buildPoint, machineFrame.origin);\n const inverse = invertBasis(machineFrame);\n\n return {\n ...point,\n x: inverse[0][0] * relative[0] + inverse[0][1] * relative[1] + inverse[0][2] * relative[2],\n y: inverse[1][0] * relative[0] + inverse[1][1] * relative[1] + inverse[1][2] * relative[2],\n z: inverse[2][0] * relative[0] + inverse[2][1] * relative[1] + inverse[2][2] * relative[2],\n };\n};\n\nexport const buildPointToMachine = (point: ToolpathPoint | { x: number; y: number; z: number }, frame?: Partial<PrinterMachineFrame>): ToolpathPoint =>\n buildPointToMachineInFrame(point, normalizeMachineFrame(frame));\n\nexport const machinePointToBuildInFrame = (point: ToolpathPoint | { x: number; y: number; z: number }, machineFrame: PrinterMachineFrame): ToolpathPoint => {\n const buildPoint = add3(\n add3(machineFrame.origin, scale3(machineFrame.xAxis, point.x)),\n add3(scale3(machineFrame.yAxis, point.y), scale3(machineFrame.zAxis, point.z)),\n );\n\n return {\n ...point,\n x: buildPoint[0],\n y: buildPoint[1],\n z: buildPoint[2],\n };\n};\n\nexport const machinePointToBuild = (point: ToolpathPoint | { x: number; y: number; z: number }, frame?: Partial<PrinterMachineFrame>): ToolpathPoint =>\n machinePointToBuildInFrame(point, normalizeMachineFrame(frame));\n\nconst fallbackXAxis = (normal: Vec3): Vec3 => {\n const nearZ = Math.abs(dot3(normal, [0, 0, 1])) > 0.95;\n return nearZ ? [1, 0, 0] : normalize3(cross3([0, 0, 1], normal));\n};\n\nexport const normalizeLayerFrame = (frame: Partial<Frame3> & { origin: Vec3; normal: Vec3 }): Frame3 => {\n const normal = normalize3(frame.normal);\n const xAxis = normalize3(frame.xAxis ?? fallbackXAxis(normal));\n const yAxis = normalize3(frame.yAxis ?? cross3(normal, xAxis));\n\n return {\n origin: tuple3(frame.origin, [0, 0, 0]),\n normal,\n xAxis,\n yAxis,\n };\n};\n\nexport const horizontalLayerFrame = (z: number): Frame3 => ({\n origin: [0, 0, z],\n normal: [0, 0, 1],\n xAxis: [1, 0, 0],\n yAxis: [0, 1, 0],\n});\n\nexport const layerDistance = (frame: Frame3) => dot3(frame.origin, frame.normal);\n\nexport const layerLocalPointToBuild = (point: ToolpathPoint, plane: Frame3): ToolpathPoint => {\n const buildPoint = add3(\n add3(plane.origin, scale3(plane.xAxis, point.x)),\n add3(scale3(plane.yAxis, point.y), scale3(plane.normal, point.z)),\n );\n\n return {\n ...point,\n x: buildPoint[0],\n y: buildPoint[1],\n z: buildPoint[2],\n };\n};\n\nexport const layerLocalPathToBuild = (path: ToolpathPath, plane: Frame3): ToolpathPath => ({\n ...path,\n points: path.points.map((point) => layerLocalPointToBuild(point, plane)),\n});\n", "import { buildPointToMachine } from \"../toolpath/coordinates\";\nimport { defaultGcodePrinter, defaultPrinterCapabilities, filament, preset } from \"./presets\";\nimport type {\n GcodeScripts,\n GcodeScriptLine,\n PrinterBedFrame,\n PrinterBounds,\n PrinterCapabilities,\n PrinterMachineFrame,\n PrinterProfile,\n ToolpathGraph,\n ToolpathObject,\n ToolpathPath,\n ToolpathPoint,\n ToolpathRole,\n} from \"../toolpath/types\";\n\ntype Axis = \"x\" | \"y\" | \"z\";\ntype GcodeAlignValue = \"none\" | \"min\" | \"center\" | \"max\" | number;\nexport type GcodeAlign = Partial<Record<Axis, GcodeAlignValue>>;\nexport type GcodeFlavor = \"marlin\" | \"klipper\" | \"reprap\" | \"bambu\";\nexport type GcodeStyle = \"ignitefuse\" | \"orca\" | \"bambu\" | \"prusa\" | \"plain\";\nexport type GcodeStartEndMode = \"standard\" | \"macro\" | \"custom\";\n\nexport type FilamentProfile = {\n bedTemp?: number;\n chamberTemp?: number;\n cooling?: {\n bridgeFanSpeed?: number;\n maxFanSpeed?: number;\n recommendedFanSpeed?: number;\n };\n diameter?: number;\n flowRatio?: number;\n nozzleTemp?: number;\n type?: string;\n};\n\nexport type PrintSpeedRule = {\n contactDistance?: number;\n layerIndex?: number | [number, number];\n name?: string;\n objectId?: string;\n roles?: ToolpathRole[];\n speed: number;\n z?: [number, number];\n};\n\nexport type PrintSpeedProfile = Partial<Record<ToolpathRole, number>> & {\n bottom?: number;\n default?: number;\n firstLayer?: number;\n mode?: \"override\" | \"preserveGraph\";\n rules?: PrintSpeedRule[];\n smallPerimeter?: number;\n top?: number;\n travel?: number;\n};\n\nexport type PrintAccelerationProfile = Partial<Record<ToolpathRole, number>> & {\n default?: number;\n firstLayer?: number;\n travel?: number;\n};\n\nexport type PrintCoolingProfile = {\n bridgeFanSpeed?: number;\n enabled?: boolean;\n fanSpeed?: number;\n maxFanSpeed?: number;\n minHeight?: number;\n minLayer?: number;\n offLayers?: number;\n rampLayers?: number;\n};\n\nexport type PrintRetractionProfile = {\n enabled?: boolean;\n length?: number;\n speed?: number;\n zHop?: number;\n};\n\nexport type PrintProfile = {\n acceleration?: PrintAccelerationProfile;\n cooling?: PrintCoolingProfile;\n retraction?: PrintRetractionProfile;\n speed?: PrintSpeedProfile;\n};\n\nexport type GcodeMetadataOptions = {\n objectLabels?: boolean;\n printStats?: boolean;\n slicerComments?: boolean;\n thumbnails?: boolean;\n};\n\nexport type GcodeOutputProfile = {\n flavor?: GcodeFlavor;\n metadata?: GcodeMetadataOptions;\n style?: GcodeStyle;\n};\n\nexport type GcodeStartEndOptions = {\n endMacro?: string;\n lines?: string[];\n mode?: GcodeStartEndMode;\n params?: Record<string, number | string | boolean | undefined>;\n purgeLine?: boolean;\n startMacro?: string;\n};\n\nexport type GcodeExportDiagnostic = {\n level: \"error\" | \"info\" | \"warning\";\n message: string;\n};\n\nexport type GcodeEmit = {\n command: (line: string) => void;\n comment: (text: string) => void;\n fan: (speed: number, comment?: string) => void;\n resetExtrusion: (comment?: string) => void;\n setAcceleration: (value: number, comment?: string) => void;\n};\n\nexport type GcodeHookContext = {\n emit: GcodeEmit;\n graph: ToolpathGraph;\n profiles: ResolvedGcodeProfiles;\n};\n\nexport type GcodeLayerHookContext = GcodeHookContext & {\n layer: ToolpathGraph[\"layers\"][number];\n};\n\nexport type GcodeObjectHookContext = GcodeLayerHookContext & {\n object?: ToolpathObject;\n objectId?: string;\n};\n\nexport type GcodePathHookContext = GcodeLayerHookContext & {\n path: ToolpathPath;\n};\n\nexport type GcodeHooks = {\n onAfterStart?: (ctx: GcodeHookContext) => void;\n onBeforeEnd?: (ctx: GcodeHookContext) => void;\n onJobEnd?: (ctx: GcodeHookContext) => void;\n onJobStart?: (ctx: GcodeHookContext) => void;\n onLayerEnd?: (ctx: GcodeLayerHookContext) => void;\n onLayerStart?: (ctx: GcodeLayerHookContext) => void;\n onObjectEnd?: (ctx: GcodeObjectHookContext) => void;\n onObjectStart?: (ctx: GcodeObjectHookContext) => void;\n onPathEnd?: (ctx: GcodePathHookContext) => void;\n onPathStart?: (ctx: GcodePathHookContext) => void;\n};\n\nexport type GcodeExportOptions = {\n align?: GcodeAlign;\n diagnosticComments?: boolean;\n end?: GcodeStartEndOptions;\n filament?: FilamentProfile | string;\n hooks?: GcodeHooks;\n machineFrame?: PrinterMachineFrame;\n onDiagnostic?: (diagnostic: GcodeExportDiagnostic) => void;\n output?: GcodeOutputProfile;\n pathOrder?: \"contact\" | \"graph\";\n print?: PrintProfile;\n printer?: Partial<PrinterProfile> | string;\n scripts?: Partial<GcodeScripts>;\n start?: GcodeStartEndOptions;\n};\n\nexport type ResolvedGcodeProfiles = {\n capabilities: PrinterCapabilities;\n filament: Required<Pick<FilamentProfile, \"diameter\" | \"flowRatio\">> & FilamentProfile;\n output: Required<Pick<GcodeOutputProfile, \"flavor\" | \"style\">> & { metadata: Required<GcodeMetadataOptions> };\n print: Required<Pick<PrintProfile, \"cooling\" | \"retraction\" | \"speed\">> & PrintProfile;\n printer: PrinterProfile;\n scripts: Partial<GcodeScripts>;\n};\n\ntype ContactMetric = (point: ToolpathPath[\"points\"][number]) => number;\ntype MachineOffset = Record<Axis, number>;\ntype AxisBounds = Record<Axis, { max: number; min: number }>;\ntype ExtrusionState = { e: number; retracted: boolean };\ntype EmitterState = {\n currentAcceleration?: number;\n currentFan?: number;\n currentObjectId?: string;\n currentPosition?: ToolpathPoint;\n extrusion: ExtrusionState;\n};\n\nconst axes = [\"x\", \"y\", \"z\"] as const;\nconst zeroOffset: MachineOffset = { x: 0, y: 0, z: 0 };\nconst extrusionRoles = new Set<ToolpathRole>([\"outerWall\", \"innerWall\", \"infill\", \"solidInfill\", \"top\", \"bottom\", \"support\"]);\n\nconst format = (value: number) => value.toFixed(3).replace(/\\.?0+$/, \"\");\nconst formatInt = (value: number) => String(Math.max(0, Math.min(255, Math.round(value))));\nconst isFiniteNumber = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value);\n\nconst resolveMachineFrame = (printer: PrinterProfile, override?: PrinterMachineFrame) =>\n override ?? printer.machineFrame ?? printer.coordinates?.machineFrame;\n\nconst hasOffset = (offset: MachineOffset) => axes.some((axis) => Math.abs(offset[axis]) > 1e-9);\n\nconst addOffset = (point: ToolpathPoint, offset: MachineOffset): ToolpathPoint => ({\n ...point,\n x: point.x + offset.x,\n y: point.y + offset.y,\n z: point.z + offset.z,\n});\n\nconst buildPointToEmittedMachine = (\n point: ToolpathPath[\"points\"][number],\n machineFrame: PrinterMachineFrame | undefined,\n offset: MachineOffset,\n) => addOffset(buildPointToMachine(point, machineFrame), offset);\n\nconst dot = (a: readonly number[], b: readonly number[]) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n\nconst normalize = (vector: readonly [number, number, number]): [number, number, number] => {\n const length = Math.hypot(vector[0], vector[1], vector[2]);\n if (length < 1e-12) return [0, 0, 1];\n return [vector[0] / length, vector[1] / length, vector[2] / length];\n};\n\nconst contactPlaneMetric = (frame: PrinterBedFrame): ContactMetric => {\n const normal = normalize(frame.normal);\n return (point) => Math.abs(dot([point.x - frame.origin[0], point.y - frame.origin[1], point.z - frame.origin[2]], normal));\n};\n\nconst buildAreaContactMetric = (buildArea: PrinterBounds): ContactMetric => {\n const contactZ = Math.min(buildArea.z[0], buildArea.z[1]);\n return (point) => Math.abs(point.z - contactZ);\n};\n\nconst gravityMetric = (gravity: readonly [number, number, number]): ContactMetric => {\n const up = normalize([-gravity[0], -gravity[1], -gravity[2]]);\n return (point) => dot([point.x, point.y, point.z], up);\n};\n\nconst contactMetricForPrinter = (printer: PrinterProfile): ContactMetric | undefined => {\n const contact = printer.process?.contact;\n if (contact && contact !== \"bed\") return contactPlaneMetric(contact);\n if (printer.buildArea) return buildAreaContactMetric(printer.buildArea);\n if ((contact === \"bed\" || contact === undefined) && printer.bed?.frame) return contactPlaneMetric(printer.bed.frame);\n if (printer.process?.gravity) return gravityMetric(printer.process.gravity);\n return undefined;\n};\n\nconst pointContactScore = (point: ToolpathPath[\"points\"][number], metric: ContactMetric) => metric(point);\n\nconst pathContactScore = (path: ToolpathPath, metric: ContactMetric) =>\n path.points.reduce((best, point) => Math.min(best, pointContactScore(point, metric)), Number.POSITIVE_INFINITY);\n\nconst rotateClosedPathToContact = (path: ToolpathPath, metric: ContactMetric): ToolpathPath => {\n if (path.points.length < 2) return path;\n\n let bestIndex = 0;\n let bestScore = Number.POSITIVE_INFINITY;\n for (let index = 0; index < path.points.length; index += 1) {\n const score = pointContactScore(path.points[index], metric);\n if (score < bestScore) {\n bestIndex = index;\n bestScore = score;\n }\n }\n\n const rotated = [...path.points.slice(bestIndex), ...path.points.slice(0, bestIndex)];\n if (rotated.length > 2) {\n const forwardScore = pointContactScore(rotated[1], metric);\n const reverseScore = pointContactScore(rotated[rotated.length - 1], metric);\n if (reverseScore < forwardScore) return { ...path, points: [rotated[0], ...rotated.slice(1).reverse()] };\n }\n\n return { ...path, points: rotated };\n};\n\nconst orientOpenPathToContact = (path: ToolpathPath, metric: ContactMetric): ToolpathPath => {\n if (path.points.length < 2) return path;\n const firstScore = pointContactScore(path.points[0], metric);\n const lastScore = pointContactScore(path.points[path.points.length - 1], metric);\n return lastScore < firstScore ? { ...path, points: [...path.points].reverse() } : path;\n};\n\nconst orderSegmentPathToContact = (path: ToolpathPath, metric: ContactMetric): ToolpathPath => {\n const segments: Array<[ToolpathPath[\"points\"][number], ToolpathPath[\"points\"][number]]> = [];\n\n for (let index = 0; index + 1 < path.points.length; index += 2) {\n const start = path.points[index];\n const end = path.points[index + 1];\n segments.push(pointContactScore(end, metric) < pointContactScore(start, metric) ? [end, start] : [start, end]);\n }\n\n segments.sort((left, right) => {\n const leftScore = Math.min(pointContactScore(left[0], metric), pointContactScore(left[1], metric));\n const rightScore = Math.min(pointContactScore(right[0], metric), pointContactScore(right[1], metric));\n return leftScore - rightScore;\n });\n\n return { ...path, points: segments.flatMap(([start, end]) => [start, end]) };\n};\n\nconst orientPathToContact = (path: ToolpathPath, metric: ContactMetric): ToolpathPath => {\n if (path.primitive === \"segments\") return orderSegmentPathToContact(path, metric);\n return path.closed ? rotateClosedPathToContact(path, metric) : orientOpenPathToContact(path, metric);\n};\n\nconst orderedPathsForGcode = (paths: ToolpathPath[], metric?: ContactMetric) => {\n if (!metric) return paths;\n\n const extrusionPaths = paths.filter((path) => path.role !== \"travel\");\n const sourcePaths = extrusionPaths.length > 0 ? extrusionPaths : paths;\n\n return sourcePaths\n .map((path, index) => ({ index, path: orientPathToContact(path, metric), score: pathContactScore(path, metric) }))\n .sort((left, right) => left.score - right.score || left.index - right.index)\n .map((entry) => entry.path);\n};\n\nconst emptyAxisBounds = (): AxisBounds => ({\n x: { max: Number.NEGATIVE_INFINITY, min: Number.POSITIVE_INFINITY },\n y: { max: Number.NEGATIVE_INFINITY, min: Number.POSITIVE_INFINITY },\n z: { max: Number.NEGATIVE_INFINITY, min: Number.POSITIVE_INFINITY },\n});\n\nconst expandAxisBounds = (bounds: AxisBounds, point: Pick<ToolpathPoint, Axis>) => {\n for (const axis of axes) {\n bounds[axis].min = Math.min(bounds[axis].min, point[axis]);\n bounds[axis].max = Math.max(bounds[axis].max, point[axis]);\n }\n};\n\nconst isFiniteAxisBounds = (bounds: AxisBounds) =>\n axes.every((axis) => Number.isFinite(bounds[axis].min) && Number.isFinite(bounds[axis].max));\n\nconst jobMachineBounds = (graph: ToolpathGraph, machineFrame: PrinterMachineFrame | undefined): AxisBounds | undefined => {\n const bounds = emptyAxisBounds();\n const points = graph.layers.flatMap((layer) => layer.paths.flatMap((path) => path.points));\n\n for (const point of points) expandAxisBounds(bounds, buildPointToMachine(point, machineFrame));\n\n return isFiniteAxisBounds(bounds) ? bounds : undefined;\n};\n\nconst alignAxisOffset = (bounds: AxisBounds[Axis], align: GcodeAlignValue) => {\n if (typeof align === \"number\") return align - bounds.min;\n if (align === \"min\") return -bounds.min;\n if (align === \"center\") return -((bounds.min + bounds.max) / 2);\n if (align === \"max\") return -bounds.max;\n return 0;\n};\n\nconst resolveAlignOffset = (\n graph: ToolpathGraph,\n machineFrame: PrinterMachineFrame | undefined,\n align: GcodeExportOptions[\"align\"],\n): MachineOffset => {\n if (!align) return zeroOffset;\n\n const bounds = jobMachineBounds(graph, machineFrame);\n if (!bounds) return zeroOffset;\n return {\n x: alignAxisOffset(bounds.x, align.x ?? \"none\"),\n y: alignAxisOffset(bounds.y, align.y ?? \"none\"),\n z: alignAxisOffset(bounds.z, align.z ?? \"none\"),\n };\n};\n\nconst resolvePrinter = (graph: ToolpathGraph, option?: GcodeExportOptions[\"printer\"]): PrinterProfile => {\n const optionProfile = typeof option === \"string\" ? preset(option) : option;\n const graphPrinter = graph.printer ?? defaultGcodePrinter;\n return {\n ...defaultGcodePrinter,\n ...graphPrinter,\n ...optionProfile,\n capabilities: {\n ...defaultPrinterCapabilities,\n ...graphPrinter.capabilities,\n ...optionProfile?.capabilities,\n },\n defaults: {\n ...graphPrinter.defaults,\n ...optionProfile?.defaults,\n },\n gcodeScripts: {\n ...graphPrinter.gcodeScripts,\n ...optionProfile?.gcodeScripts,\n },\n machineFrame: optionProfile?.machineFrame ?? graphPrinter.machineFrame ?? graphPrinter.coordinates?.machineFrame ?? defaultGcodePrinter.machineFrame,\n };\n};\n\nconst resolveFilament = (printer: PrinterProfile, option?: GcodeExportOptions[\"filament\"]): ResolvedGcodeProfiles[\"filament\"] => {\n const input = typeof option === \"string\" ? filament(option) : option ?? {};\n return {\n ...input,\n bedTemp: input.bedTemp ?? printer.defaults?.bedTemp,\n chamberTemp: input.chamberTemp ?? printer.defaults?.chamberTemp,\n diameter: input.diameter ?? printer.defaults?.filamentDiameter ?? printer.filament ?? 1.75,\n flowRatio: input.flowRatio ?? 1,\n nozzleTemp: input.nozzleTemp ?? printer.defaults?.nozzleTemp,\n };\n};\n\nconst resolveOutput = (printer: PrinterProfile, output: GcodeExportOptions[\"output\"]): ResolvedGcodeProfiles[\"output\"] => {\n const flavor = output?.flavor ?? (printer.gcodeFlavor as GcodeFlavor | undefined) ?? \"marlin\";\n const style = output?.style ?? (printer.gcodeStyle as GcodeStyle | undefined) ?? (flavor === \"bambu\" ? \"bambu\" : \"orca\");\n return {\n flavor,\n style,\n metadata: {\n objectLabels: output?.metadata?.objectLabels ?? false,\n printStats: output?.metadata?.printStats ?? true,\n slicerComments: output?.metadata?.slicerComments ?? true,\n thumbnails: output?.metadata?.thumbnails ?? false,\n },\n };\n};\n\nconst resolvePrint = (\n printer: PrinterProfile,\n filamentProfile: ResolvedGcodeProfiles[\"filament\"],\n print: GcodeExportOptions[\"print\"],\n): ResolvedGcodeProfiles[\"print\"] => ({\n ...print,\n acceleration: print?.acceleration,\n cooling: {\n enabled: printer.capabilities?.partCoolingFan !== false,\n fanSpeed: filamentProfile.cooling?.recommendedFanSpeed ?? 180,\n maxFanSpeed: filamentProfile.cooling?.maxFanSpeed ?? 255,\n offLayers: 1,\n rampLayers: 0,\n ...print?.cooling,\n },\n retraction: {\n enabled: false,\n length: 0.8,\n speed: 2100,\n zHop: 0,\n ...print?.retraction,\n },\n speed: {\n mode: \"preserveGraph\",\n travel: printer.defaults?.travelSpeed ?? 7200,\n ...print?.speed,\n },\n});\n\nconst resolveProfiles = (graph: ToolpathGraph, options: GcodeExportOptions): ResolvedGcodeProfiles => {\n const printerProfile = resolvePrinter(graph, options.printer);\n const filamentProfile = resolveFilament(printerProfile, options.filament);\n return {\n capabilities: {\n ...defaultPrinterCapabilities,\n ...printerProfile.capabilities,\n },\n filament: filamentProfile,\n output: resolveOutput(printerProfile, options.output),\n print: resolvePrint(printerProfile, filamentProfile, options.print),\n printer: printerProfile,\n scripts: {\n ...printerProfile.gcodeScripts,\n ...options.scripts,\n },\n };\n};\n\nconst roleLabel: Record<ToolpathRole, string> = {\n bottom: \"Bottom solid infill\",\n infill: \"Sparse infill\",\n innerWall: \"Inner wall\",\n outerWall: \"Outer wall\",\n solidInfill: \"Internal solid infill\",\n support: \"Support\",\n top: \"Top solid infill\",\n travel: \"Travel\",\n};\n\nconst featureRoleLabel: Record<ToolpathRole, string> = {\n bottom: \"Bottom surface\",\n infill: \"Sparse infill\",\n innerWall: \"Inner wall\",\n outerWall: \"Outer wall\",\n solidInfill: \"Internal solid infill\",\n support: \"Support\",\n top: \"Top surface\",\n travel: \"Travel\",\n};\n\nconst commentLine = (text: string, style: GcodeStyle) => {\n if (style === \"plain\") return \"\";\n return `; ${text}`;\n};\n\nconst typeComment = (role: ToolpathRole, style: GcodeStyle) => {\n if (style === \"plain\") return \"\";\n if (style === \"orca\" || style === \"bambu\") return `; FEATURE: ${featureRoleLabel[role]}`;\n if (style === \"prusa\") return `;TYPE:${roleLabel[role]}`;\n return `; ${role} path`;\n};\n\nconst vectorComment = (vector: readonly number[]) => vector.map((value) => format(value)).join(\",\");\n\nconst layerComments = (\n layer: ToolpathGraph[\"layers\"][number],\n profiles: ResolvedGcodeProfiles,\n layerOrdinal: number,\n totalLayerCount: number,\n previousLayer?: ToolpathGraph[\"layers\"][number],\n) => {\n const style = profiles.output.style;\n if (style === \"plain\") return [];\n const height = previousLayer ? Math.abs(layer.z - previousLayer.z) : layer.paths[0]?.extrusion?.height ?? layer.z;\n const planeComment = `;IF_LAYER_PLANE O${vectorComment(layer.plane.origin)} N${vectorComment(layer.plane.normal)} X${vectorComment(layer.plane.xAxis)} Y${vectorComment(layer.plane.yAxis)}`;\n const layerHeight = format(height || layer.paths[0]?.extrusion?.height || 0);\n\n if (style === \"orca\" || style === \"bambu\") {\n const comments = [\n \"; CHANGE_LAYER\",\n `; Z_HEIGHT: ${format(layer.z)}`,\n `; LAYER_HEIGHT: ${layerHeight}`,\n planeComment,\n `; layer num/total_layer_count: ${layerOrdinal}/${totalLayerCount}`,\n \"; update layer progress\",\n ];\n\n if (style === \"bambu\" && profiles.output.flavor === \"bambu\" && scriptLineCount(profiles.scripts.layerChange, profiles.capabilities) === 0) {\n if (profiles.capabilities.supportsM73) {\n comments.push(`M73 L${layerOrdinal}`);\n comments.push(`M991 S0 P${layerOrdinal - 1} ;notify layer change`);\n }\n }\n\n return comments;\n }\n\n if (style === \"prusa\") {\n return [\n \";LAYER_CHANGE\",\n `;LAYER:${layer.index}`,\n `;Z:${format(layer.z)}`,\n `;HEIGHT:${layerHeight}`,\n planeComment,\n ];\n }\n\n return [`; Layer ${layer.index} Z${format(layer.z)}`, `;LAYER:${layer.index}`, planeComment];\n};\n\nconst distance = (a: ToolpathPoint, b: ToolpathPoint) => Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z);\nconst extrusionArea = (diameter: number) => Math.PI * (diameter / 2) ** 2;\nconst shouldExtrude = (path: ToolpathPath) => path.role !== \"travel\" && Boolean(path.extrusion) && extrusionRoles.has(path.role);\n\nconst speedRuleMatches = (\n rule: PrintSpeedRule,\n layer: ToolpathGraph[\"layers\"][number],\n path: ToolpathPath,\n contactMetric?: ContactMetric,\n) => {\n if (rule.roles && !rule.roles.includes(path.role)) return false;\n if (rule.objectId && rule.objectId !== path.objectId) return false;\n if (typeof rule.layerIndex === \"number\" && layer.index !== rule.layerIndex) return false;\n if (Array.isArray(rule.layerIndex) && (layer.index < rule.layerIndex[0] || layer.index > rule.layerIndex[1])) return false;\n if (rule.z && (layer.z < rule.z[0] || layer.z > rule.z[1])) return false;\n if (typeof rule.contactDistance === \"number\") {\n if (!contactMetric || pathContactScore(path, contactMetric) > rule.contactDistance) return false;\n }\n return true;\n};\n\nconst resolvePathSpeed = (\n layer: ToolpathGraph[\"layers\"][number],\n path: ToolpathPath,\n profiles: ResolvedGcodeProfiles,\n contactMetric?: ContactMetric,\n) => {\n const speed = profiles.print.speed;\n let resolved = speed.mode === \"override\" ? speed.default ?? path.speed : path.speed;\n\n if (path.role === \"travel\" && isFiniteNumber(speed.travel)) resolved = speed.travel;\n if (path.role !== \"travel\" && layer.index === 0 && isFiniteNumber(speed.firstLayer)) resolved = speed.firstLayer;\n if ((path.role === \"bottom\" || path.role === \"solidInfill\") && layer.index === 0 && isFiniteNumber(speed.bottom)) resolved = speed.bottom;\n if (path.role === \"top\" && isFiniteNumber(speed.top)) resolved = speed.top;\n const roleSpeed = speed[path.role];\n if (isFiniteNumber(roleSpeed)) resolved = roleSpeed;\n\n for (const rule of speed.rules ?? []) {\n if (speedRuleMatches(rule, layer, path, contactMetric)) resolved = rule.speed;\n }\n\n return Math.max(1, resolved || speed.default || 1200);\n};\n\nconst resolvePathAcceleration = (\n layer: ToolpathGraph[\"layers\"][number],\n path: ToolpathPath,\n profiles: ResolvedGcodeProfiles,\n) => {\n const acceleration = profiles.print.acceleration;\n if (!acceleration) return undefined;\n if (layer.index === 0 && isFiniteNumber(acceleration.firstLayer)) return acceleration.firstLayer;\n if (path.role === \"travel\" && isFiniteNumber(acceleration.travel)) return acceleration.travel;\n return acceleration[path.role] ?? acceleration.default;\n};\n\nconst macroLine = (name: string, params: GcodeStartEndOptions[\"params\"]) => {\n const entries = Object.entries(params ?? {})\n .filter((entry): entry is [string, string | number | boolean] => entry[1] !== undefined)\n .map(([key, value]) => `${key}=${value}`);\n return [name, ...entries].join(\" \");\n};\n\ntype GcodeTemplateContext = {\n alignOffset?: MachineOffset;\n graph: ToolpathGraph;\n layer?: ToolpathGraph[\"layers\"][number];\n layerHeight?: number;\n layerOrdinal?: number;\n machineFrame?: PrinterMachineFrame;\n profiles: ResolvedGcodeProfiles;\n};\n\nconst templateVariableNames = [\n \"bed_temperature\",\n \"bed_temperature_initial_layer\",\n \"bed_temperature_initial_layer_single\",\n \"filament_diameter\",\n \"filament_type\",\n \"first_layer_bed_temperature\",\n \"first_layer_print_max_x\",\n \"first_layer_print_max_y\",\n \"first_layer_print_min_x\",\n \"first_layer_print_min_y\",\n \"first_layer_print_size_x\",\n \"first_layer_print_size_y\",\n \"first_layer_temperature\",\n \"layer_height\",\n \"layer_num\",\n \"layer_z\",\n \"machine_name\",\n \"max_layer_z\",\n \"nozzle_diameter\",\n \"nozzle_temperature\",\n \"nozzle_temperature_initial_layer\",\n \"print_max_x\",\n \"print_max_y\",\n \"print_max_z\",\n \"print_min_x\",\n \"print_min_y\",\n \"print_min_z\",\n \"print_size_x\",\n \"print_size_y\",\n \"print_size_z\",\n \"printer_name\",\n \"temperature\",\n \"total_layer_count\",\n] as const;\n\nconst templateVariableNameSet = new Set<string>(templateVariableNames);\n\nconst scriptToLines = (script: GcodeScripts[keyof GcodeScripts] | undefined) => {\n if (!script) return [];\n return Array.isArray(script) ? script : script.split(/\\r?\\n/);\n};\n\nconst scriptEntryText = (entry: GcodeScriptLine) => typeof entry === \"string\" ? entry : entry.line;\n\nconst capabilityEnabled = (capabilities: PrinterCapabilities, capability: keyof PrinterCapabilities) =>\n Boolean(capabilities[capability]);\n\nconst scriptEntryEnabled = (entry: GcodeScriptLine, capabilities: PrinterCapabilities) => {\n if (typeof entry === \"string\" || !entry.when) return true;\n const { allCapabilities, anyCapabilities, capability, notCapability } = entry.when;\n if (capability && !capabilityEnabled(capabilities, capability)) return false;\n if (notCapability && capabilityEnabled(capabilities, notCapability)) return false;\n if (allCapabilities?.some((key) => !capabilityEnabled(capabilities, key))) return false;\n if (anyCapabilities && anyCapabilities.length > 0 && !anyCapabilities.some((key) => capabilityEnabled(capabilities, key))) return false;\n return true;\n};\n\nconst scriptToEnabledLines = (script: GcodeScripts[keyof GcodeScripts] | undefined, capabilities: PrinterCapabilities) =>\n scriptToLines(script)\n .filter((entry) => scriptEntryEnabled(entry, capabilities))\n .map(scriptEntryText);\n\nconst templateBoundsForPaths = (\n paths: ToolpathPath[],\n machineFrame: PrinterMachineFrame | undefined,\n alignOffset: MachineOffset = zeroOffset,\n): AxisBounds | undefined => {\n const bounds = emptyAxisBounds();\n for (const path of paths) {\n if (!shouldExtrude(path)) continue;\n for (const point of path.points) expandAxisBounds(bounds, buildPointToEmittedMachine(point, machineFrame, alignOffset));\n }\n return isFiniteAxisBounds(bounds) ? bounds : undefined;\n};\n\nconst graphExtrusionBounds = (\n graph: ToolpathGraph,\n machineFrame: PrinterMachineFrame | undefined,\n alignOffset: MachineOffset = zeroOffset,\n) => templateBoundsForPaths(graph.layers.flatMap((layer) => layer.paths), machineFrame, alignOffset);\n\nconst firstLayerExtrusionBounds = (\n graph: ToolpathGraph,\n machineFrame: PrinterMachineFrame | undefined,\n alignOffset: MachineOffset = zeroOffset,\n) => {\n const firstExtrusionLayer = graph.layers.find((layer) => layer.paths.some((path) => shouldExtrude(path)));\n return firstExtrusionLayer ? templateBoundsForPaths(firstExtrusionLayer.paths, machineFrame, alignOffset) : undefined;\n};\n\nconst axisRangeSize = (bounds: AxisBounds | undefined, axis: Axis) =>\n bounds ? Math.max(0, bounds[axis].max - bounds[axis].min) : 0;\n\nconst axisRangeMin = (bounds: AxisBounds | undefined, axis: Axis) =>\n bounds ? bounds[axis].min : 0;\n\nconst axisRangeMax = (bounds: AxisBounds | undefined, axis: Axis) =>\n bounds ? bounds[axis].max : 0;\n\nconst templateVariables = (context: GcodeTemplateContext): Record<string, number | string> => {\n const { graph, layer, layerHeight, layerOrdinal, profiles } = context;\n const layerNumber = layerOrdinal ? layerOrdinal - 1 : layer?.index ?? 0;\n const bedTemp = profiles.filament.bedTemp ?? profiles.printer.defaults?.bedTemp ?? 0;\n const nozzleTemp = profiles.filament.nozzleTemp ?? profiles.printer.defaults?.nozzleTemp ?? 0;\n const jobBounds = graphExtrusionBounds(graph, context.machineFrame, context.alignOffset);\n const firstLayerBounds = firstLayerExtrusionBounds(graph, context.machineFrame, context.alignOffset);\n return {\n bed_temperature: bedTemp,\n bed_temperature_initial_layer: bedTemp,\n bed_temperature_initial_layer_single: bedTemp,\n first_layer_bed_temperature: bedTemp,\n first_layer_print_max_x: axisRangeMax(firstLayerBounds, \"x\"),\n first_layer_print_max_y: axisRangeMax(firstLayerBounds, \"y\"),\n first_layer_print_min_x: axisRangeMin(firstLayerBounds, \"x\"),\n first_layer_print_min_y: axisRangeMin(firstLayerBounds, \"y\"),\n first_layer_print_size_x: axisRangeSize(firstLayerBounds, \"x\"),\n first_layer_print_size_y: axisRangeSize(firstLayerBounds, \"y\"),\n first_layer_temperature: nozzleTemp,\n filament_diameter: profiles.filament.diameter,\n filament_type: profiles.filament.type ?? \"UNKNOWN\",\n layer_height: layerHeight ?? layer?.paths[0]?.extrusion?.height ?? profiles.printer.layerHeight,\n layer_num: layerNumber,\n layer_z: layer?.z ?? 0,\n machine_name: profiles.printer.name ?? \"unknown\",\n max_layer_z: maxLayerZ(graph),\n nozzle_diameter: profiles.printer.nozzle,\n nozzle_temperature: nozzleTemp,\n nozzle_temperature_initial_layer: nozzleTemp,\n print_max_x: axisRangeMax(jobBounds, \"x\"),\n print_max_y: axisRangeMax(jobBounds, \"y\"),\n print_max_z: axisRangeMax(jobBounds, \"z\"),\n print_min_x: axisRangeMin(jobBounds, \"x\"),\n print_min_y: axisRangeMin(jobBounds, \"y\"),\n print_min_z: axisRangeMin(jobBounds, \"z\"),\n print_size_x: axisRangeSize(jobBounds, \"x\"),\n print_size_y: axisRangeSize(jobBounds, \"y\"),\n print_size_z: axisRangeSize(jobBounds, \"z\"),\n printer_name: profiles.printer.name ?? \"unknown\",\n temperature: nozzleTemp,\n total_layer_count: graph.layers.length,\n };\n};\n\nconst resolveTemplateValue = (expression: string, variables: Record<string, number | string>) => {\n const trimmed = expression.trim();\n if (trimmed in variables) return String(variables[trimmed]);\n\n const math = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*([+-])\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (math) {\n const value = variables[math[1]];\n if (typeof value === \"number\") {\n const operand = Number(math[3]);\n return format(math[2] === \"+\" ? value + operand : value - operand);\n }\n }\n\n return undefined;\n};\n\nconst isSupportedTemplateExpression = (expression: string) => {\n const trimmed = expression.trim();\n if (templateVariableNameSet.has(trimmed)) return true;\n\n const math = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*([+-])\\s*(-?\\d+(?:\\.\\d+)?)$/);\n return Boolean(math && templateVariableNameSet.has(math[1]));\n};\n\nconst templateExpressionKind = (expression: string) => {\n const trimmed = expression.trim();\n if (/^(if|elsif|elif|else|endif)\\b/i.test(trimmed)) return \"conditional\";\n return isSupportedTemplateExpression(trimmed) ? \"supported\" : \"unsupported\";\n};\n\nconst scriptTemplateDiagnostics = (scripts: Partial<GcodeScripts>, capabilities: PrinterCapabilities) => {\n const diagnostics = new Map<string, GcodeExportDiagnostic>();\n for (const [name, script] of Object.entries(scripts)) {\n for (const line of scriptToEnabledLines(script, capabilities)) {\n for (const match of line.matchAll(/\\[([^\\]]+)\\]|\\{([^{}]+)\\}/g)) {\n const expression = match[1] ?? match[2] ?? \"\";\n const kind = templateExpressionKind(expression);\n if (kind === \"conditional\") {\n const message = `gcodeScripts.${name} uses unsupported conditional template \"${expression.trim()}\".`;\n diagnostics.set(message, { level: \"warning\", message });\n } else if (kind === \"unsupported\") {\n const message = `gcodeScripts.${name} uses unsupported template placeholder \"${expression.trim()}\".`;\n diagnostics.set(message, { level: \"warning\", message });\n }\n }\n }\n }\n return [...diagnostics.values()];\n};\n\nconst renderScriptLine = (line: string, context: GcodeTemplateContext) => {\n const variables = templateVariables(context);\n return line.replace(/\\[([^\\]]+)\\]|\\{([^{}]+)\\}/g, (match, bracketExpression: string | undefined, braceExpression: string | undefined) =>\n resolveTemplateValue(bracketExpression ?? braceExpression ?? \"\", variables) ?? match,\n );\n};\n\nconst renderScript = (script: GcodeScripts[keyof GcodeScripts] | undefined, context: GcodeTemplateContext) =>\n scriptToEnabledLines(script, context.profiles.capabilities).map((line) => renderScriptLine(line, context));\n\nconst scriptLineCount = (script: GcodeScripts[keyof GcodeScripts] | undefined, capabilities: PrinterCapabilities) =>\n scriptToEnabledLines(script, capabilities).filter((line) => line.trim().length > 0).length;\n\nconst standardStart = (profiles: ResolvedGcodeProfiles, start: GcodeStartEndOptions) => {\n const lines: string[] = [];\n const { capabilities, filament: filamentProfile, output } = profiles;\n\n if (output.flavor !== \"klipper\") lines.push(\"G21 ; millimeters\");\n lines.push(\"G90 ; absolute coordinates\");\n lines.push(\"M82 ; absolute extrusion\");\n\n if (capabilities.heatedBed && isFiniteNumber(filamentProfile.bedTemp)) {\n lines.push(`M140 S${format(filamentProfile.bedTemp)} ; set bed temperature`);\n }\n if (isFiniteNumber(filamentProfile.nozzleTemp)) {\n lines.push(`M104 S${format(filamentProfile.nozzleTemp)} ; set nozzle temperature`);\n }\n\n lines.push(\"G28 ; home all axes\");\n\n if (capabilities.heatedBed && isFiniteNumber(filamentProfile.bedTemp)) {\n lines.push(`M190 S${format(filamentProfile.bedTemp)} ; wait for bed temperature`);\n }\n if (isFiniteNumber(filamentProfile.nozzleTemp)) {\n lines.push(`M109 S${format(filamentProfile.nozzleTemp)} ; wait for nozzle temperature`);\n }\n\n lines.push(\"G92 E0 ; reset extrusion\");\n\n if (start.purgeLine) {\n const z = 0.28;\n lines.push(\"G0 X5 Y5 Z0.28 F7200 ; purge start\");\n lines.push(\"G1 X5 Y80 E6 F900 ; purge line\");\n lines.push(\"G92 E0 ; reset extrusion after purge\");\n lines.push(`G0 Z${format(z + 0.2)} F7200 ; lift after purge`);\n }\n\n return lines;\n};\n\nconst emitStart = (profiles: ResolvedGcodeProfiles, start: GcodeStartEndOptions | undefined, context: GcodeTemplateContext) => {\n const resolved = start ?? {};\n if (resolved.mode === \"custom\") return resolved.lines ?? [];\n if (resolved.mode === \"macro\") return [macroLine(resolved.startMacro ?? \"START_PRINT\", resolved.params)];\n if (scriptLineCount(profiles.scripts.machineStart, profiles.capabilities) > 0) return renderScript(profiles.scripts.machineStart, context);\n return standardStart(profiles, { ...resolved, mode: \"standard\" });\n};\n\nconst standardEnd = (profiles: ResolvedGcodeProfiles) => {\n const lines: string[] = [];\n if (profiles.capabilities.partCoolingFan !== false) lines.push(\"M107 ; fan off\");\n lines.push(\"M104 S0 ; hotend off\");\n if (profiles.capabilities.heatedBed) lines.push(\"M140 S0 ; bed off\");\n lines.push(\"G91 ; relative positioning\");\n lines.push(\"G0 Z10 F1200 ; lift\");\n lines.push(\"G90 ; absolute positioning\");\n lines.push(\"M2 ; end\");\n return lines;\n};\n\nconst emitEnd = (profiles: ResolvedGcodeProfiles, end: GcodeStartEndOptions | undefined, context: GcodeTemplateContext) => {\n const resolved = end ?? {};\n if (resolved.mode === \"custom\") return resolved.lines ?? [];\n if (resolved.mode === \"macro\") return [macroLine(resolved.endMacro ?? \"END_PRINT\", resolved.params)];\n if (scriptLineCount(profiles.scripts.machineEnd, profiles.capabilities) > 0) return renderScript(profiles.scripts.machineEnd, context);\n return standardEnd(profiles);\n};\n\nconst machineBasisDeterminant = (frame: PrinterMachineFrame | undefined) => {\n if (!frame) return 1;\n const [a, b, c] = frame.xAxis;\n const [d, e, f] = frame.yAxis;\n const [g, h, i] = frame.zAxis;\n return a * (e * i - f * h) - d * (b * i - c * h) + g * (b * f - c * e);\n};\n\nconst validateExport = (\n graph: ToolpathGraph,\n profiles: ResolvedGcodeProfiles,\n machineFrame: PrinterMachineFrame | undefined,\n) => {\n const diagnostics: GcodeExportDiagnostic[] = [];\n if (Math.abs(machineBasisDeterminant(machineFrame)) < 1e-9) diagnostics.push({ level: \"warning\", message: \"machineFrame basis is not invertible.\" });\n if (graph.layers.length === 0) diagnostics.push({ level: \"warning\", message: \"ToolpathGraph has no layers.\" });\n if (!graph.layers.some((layer) => layer.paths.some((path) => shouldExtrude(path)))) {\n diagnostics.push({ level: \"warning\", message: \"ToolpathGraph has no extrusion paths.\" });\n }\n if (!isFiniteNumber(profiles.filament.diameter) || profiles.filament.diameter <= 0) {\n diagnostics.push({ level: \"warning\", message: \"filament diameter must be positive.\" });\n }\n if (!isFiniteNumber(profiles.filament.nozzleTemp)) {\n diagnostics.push({ level: \"warning\", message: \"nozzle temperature is not set.\" });\n }\n if (profiles.capabilities.heatedBed && !isFiniteNumber(profiles.filament.bedTemp)) {\n diagnostics.push({ level: \"warning\", message: \"bed temperature is not set for a heated-bed printer.\" });\n }\n\n for (const layer of graph.layers) {\n for (const path of layer.paths) {\n if (path.points.length < 2) diagnostics.push({ level: \"warning\", message: `path ${path.id} has fewer than two points.` });\n if (!isFiniteNumber(path.speed) || path.speed <= 0) diagnostics.push({ level: \"warning\", message: `path ${path.id} has invalid speed.` });\n for (const point of path.points) {\n if (!isFiniteNumber(point.x) || !isFiniteNumber(point.y) || !isFiniteNumber(point.z)) {\n diagnostics.push({ level: \"warning\", message: `path ${path.id} contains non-finite coordinates.` });\n break;\n }\n }\n }\n }\n\n if (profiles.output.metadata.objectLabels && !graph.objects?.length) {\n diagnostics.push({ level: \"warning\", message: \"objectLabels requested but ToolpathGraph has no object metadata.\" });\n }\n diagnostics.push(...scriptTemplateDiagnostics(profiles.scripts, profiles.capabilities));\n\n return [...new Map(diagnostics.map((diagnostic) => [`${diagnostic.level}:${diagnostic.message}`, diagnostic])).values()];\n};\n\nconst createEmit = (lines: string[], profiles: ResolvedGcodeProfiles, state: EmitterState): GcodeEmit => ({\n command: (line) => {\n if (line.trim()) lines.push(line);\n },\n comment: (text) => {\n const line = commentLine(text, profiles.output.style);\n if (line) lines.push(line);\n },\n fan: (speed, comment) => {\n if (profiles.capabilities.partCoolingFan === false) return;\n const clamped = Math.max(0, Math.min(255, speed));\n if (state.currentFan === Math.round(clamped)) return;\n state.currentFan = Math.round(clamped);\n lines.push(clamped <= 0 ? `M107${comment ? ` ; ${comment}` : \"\"}` : `M106 S${formatInt(clamped)}${comment ? ` ; ${comment}` : \"\"}`);\n },\n resetExtrusion: (comment) => {\n state.extrusion.e = 0;\n lines.push(`G92 E0${comment ? ` ; ${comment}` : \"\"}`);\n },\n setAcceleration: (value, comment) => {\n if (!isFiniteNumber(value) || value <= 0 || state.currentAcceleration === value) return;\n state.currentAcceleration = value;\n lines.push(`M204 S${format(value)}${comment ? ` ; ${comment}` : \"\"}`);\n },\n});\n\nconst hookContext = (emit: GcodeEmit, graph: ToolpathGraph, profiles: ResolvedGcodeProfiles): GcodeHookContext => ({\n emit,\n graph,\n profiles,\n});\n\nconst maybeEmitLayerFan = (\n layer: ToolpathGraph[\"layers\"][number],\n emit: GcodeEmit,\n profiles: ResolvedGcodeProfiles,\n) => {\n const cooling = profiles.print.cooling;\n if (!cooling.enabled || profiles.capabilities.partCoolingFan === false) return;\n\n const offLayers = cooling.offLayers ?? 0;\n const minLayer = cooling.minLayer ?? offLayers;\n const minHeight = cooling.minHeight ?? Number.NEGATIVE_INFINITY;\n if (layer.index < offLayers || layer.index < minLayer || layer.z < minHeight) {\n emit.fan(0, \"part cooling off\");\n return;\n }\n\n const target = Math.min(cooling.fanSpeed ?? 0, cooling.maxFanSpeed ?? 255);\n const rampLayers = cooling.rampLayers ?? 0;\n if (rampLayers > 0 && layer.index < minLayer + rampLayers) {\n const step = layer.index - minLayer + 1;\n emit.fan((target * step) / rampLayers, \"part cooling ramp\");\n return;\n }\n\n emit.fan(target, \"part cooling\");\n};\n\nconst emitMoveTo = (\n point: ToolpathPath[\"points\"][number],\n speed: number,\n machineFrame: PrinterMachineFrame | undefined,\n offset: MachineOffset,\n) => {\n const machinePoint = buildPointToEmittedMachine(point, machineFrame, offset);\n return `G0 X${format(machinePoint.x)} Y${format(machinePoint.y)} Z${format(machinePoint.z)} F${format(speed)}`;\n};\n\nconst emitExtrudeTo = (\n from: ToolpathPath[\"points\"][number],\n to: ToolpathPath[\"points\"][number],\n path: ToolpathPath,\n speed: number,\n profiles: ResolvedGcodeProfiles,\n extrusionState: ExtrusionState,\n machineFrame: PrinterMachineFrame | undefined,\n offset: MachineOffset,\n) => {\n const machinePoint = buildPointToEmittedMachine(to, machineFrame, offset);\n const width = path.extrusion?.width ?? profiles.printer.nozzle * 1.1;\n const height = path.extrusion?.height ?? profiles.printer.layerHeight;\n const volume = distance(from, to) * width * height * profiles.filament.flowRatio;\n extrusionState.e += volume / extrusionArea(profiles.filament.diameter);\n return `G1 X${format(machinePoint.x)} Y${format(machinePoint.y)} Z${format(machinePoint.z)} E${format(extrusionState.e)} F${format(speed)}`;\n};\n\nconst emitRetraction = (\n lines: string[],\n profiles: ResolvedGcodeProfiles,\n state: EmitterState,\n retracted: boolean,\n) => {\n const retraction = profiles.print.retraction;\n if (!retraction.enabled || !retraction.length || state.extrusion.retracted === retracted) return;\n\n state.extrusion.e += retracted ? -retraction.length : retraction.length;\n state.extrusion.retracted = retracted;\n lines.push(`G1 E${format(state.extrusion.e)} F${format(retraction.speed ?? 2100)} ; ${retracted ? \"retract\" : \"unretract\"}`);\n};\n\nconst emitPathStartMove = (\n path: ToolpathPath,\n speed: number,\n lines: string[],\n profiles: ResolvedGcodeProfiles,\n state: EmitterState,\n machineFrame: PrinterMachineFrame | undefined,\n alignOffset: MachineOffset,\n) => {\n const first = path.points[0];\n if (!first) return;\n\n const travelDistance = state.currentPosition ? distance(state.currentPosition, first) : 0;\n const isExtrusionPath = shouldExtrude(path);\n if (travelDistance > 1e-6 && isExtrusionPath) emitRetraction(lines, profiles, state, true);\n\n const zHop = profiles.print.retraction.enabled ? profiles.print.retraction.zHop ?? 0 : 0;\n if (state.currentPosition && zHop > 0 && travelDistance > 1e-6 && isExtrusionPath) {\n lines.push(emitMoveTo({ ...state.currentPosition, z: state.currentPosition.z + zHop }, profiles.print.speed.travel ?? speed, machineFrame, alignOffset));\n }\n\n lines.push(emitMoveTo(first, path.role === \"travel\" ? speed : profiles.print.speed.travel ?? speed, machineFrame, alignOffset));\n\n if (zHop > 0 && travelDistance > 1e-6 && isExtrusionPath) {\n lines.push(emitMoveTo(first, profiles.print.speed.travel ?? speed, machineFrame, alignOffset));\n }\n\n if (isExtrusionPath) emitRetraction(lines, profiles, state, false);\n state.currentPosition = first;\n};\n\nconst emitPathGeometry = (\n path: ToolpathPath,\n speed: number,\n lines: string[],\n profiles: ResolvedGcodeProfiles,\n state: EmitterState,\n machineFrame: PrinterMachineFrame | undefined,\n alignOffset: MachineOffset,\n) => {\n if (path.points.length === 0) return;\n\n emitPathStartMove(path, speed, lines, profiles, state, machineFrame, alignOffset);\n\n const points = path.closed ? [...path.points.slice(1), path.points[0]] : path.points.slice(1);\n for (const point of points) {\n const previous = state.currentPosition ?? path.points[0];\n if (!shouldExtrude(path)) {\n lines.push(emitMoveTo(point, speed, machineFrame, alignOffset));\n } else {\n lines.push(emitExtrudeTo(previous, point, path, speed, profiles, state.extrusion, machineFrame, alignOffset));\n }\n state.currentPosition = point;\n }\n};\n\nconst objectLabelMode = (profiles: ResolvedGcodeProfiles) => {\n if (!profiles.output.metadata.objectLabels) return \"none\";\n if (profiles.output.flavor === \"klipper\" && profiles.capabilities.supportsExcludeObject !== false) return \"klipper\";\n if (profiles.capabilities.supportsM486) return \"m486\";\n if (profiles.output.style === \"orca\" || profiles.output.style === \"bambu\" || profiles.output.style === \"prusa\") return \"comment\";\n return \"none\";\n};\n\nconst emitObjectDefinitions = (graph: ToolpathGraph, profiles: ResolvedGcodeProfiles) => {\n const mode = objectLabelMode(profiles);\n if (mode !== \"klipper\" || !graph.objects?.length) return [];\n return graph.objects.map((object) => {\n const center = object.center ? `${format(object.center[0])},${format(object.center[1])}` : \"0,0\";\n const polygon = object.polygon?.length\n ? ` POLYGON=[${object.polygon.map((point) => `[${format(point[0])},${format(point[1])}]`).join(\",\")}]`\n : \"\";\n return `EXCLUDE_OBJECT_DEFINE NAME=${object.id} CENTER=${center}${polygon}`;\n });\n};\n\nconst objectIndex = (graph: ToolpathGraph, objectId: string) =>\n Math.max(0, graph.objects?.findIndex((object) => object.id === objectId) ?? 0);\n\nconst emitObjectBoundary = (\n lines: string[],\n nextObjectId: string | undefined,\n graph: ToolpathGraph,\n profiles: ResolvedGcodeProfiles,\n state: EmitterState,\n emit: GcodeEmit,\n layer: ToolpathGraph[\"layers\"][number],\n hooks?: GcodeHooks,\n) => {\n if (!profiles.output.metadata.objectLabels || state.currentObjectId === nextObjectId) return;\n const mode = objectLabelMode(profiles);\n const previous = state.currentObjectId ? graph.objects?.find((object) => object.id === state.currentObjectId) : undefined;\n if (state.currentObjectId) {\n hooks?.onObjectEnd?.({ ...hookContext(emit, graph, profiles), layer, object: previous, objectId: state.currentObjectId });\n if (mode === \"klipper\") lines.push(`EXCLUDE_OBJECT_END NAME=${state.currentObjectId}`);\n else if (mode === \"m486\") lines.push(\"M486 S-1\");\n else if (mode === \"comment\") lines.push(`;OBJECT_END:${state.currentObjectId}`);\n }\n\n state.currentObjectId = nextObjectId;\n if (!nextObjectId) return;\n\n const next = graph.objects?.find((object) => object.id === nextObjectId);\n if (mode === \"klipper\") lines.push(`EXCLUDE_OBJECT_START NAME=${nextObjectId}`);\n else if (mode === \"m486\") lines.push(`M486 S${objectIndex(graph, nextObjectId)}`);\n else if (mode === \"comment\") lines.push(`;OBJECT:${next?.name ?? nextObjectId}`);\n hooks?.onObjectStart?.({ ...hookContext(emit, graph, profiles), layer, object: next, objectId: nextObjectId });\n};\n\nconst maxLayerZ = (graph: ToolpathGraph) =>\n graph.layers.reduce((max, layer) => Math.max(max, layer.z), 0);\n\nconst headerLines = (graph: ToolpathGraph, profiles: ResolvedGcodeProfiles) => {\n if (profiles.output.style === \"plain\") return [];\n\n if (profiles.output.style === \"bambu\") {\n const lines = [\n \"; HEADER_BLOCK_START\",\n \"; IgniteFuse\",\n `; total layer number: ${graph.layers.length}`,\n `; filament_diameter: ${format(profiles.filament.diameter)}`,\n `; nozzle_diameter: ${format(profiles.printer.nozzle)}`,\n `; max_z_height: ${format(maxLayerZ(graph))}`,\n ];\n if (profiles.output.metadata.printStats) {\n lines.push(`; path_count: ${graph.stats.pathCount}`);\n }\n lines.push(\"; HEADER_BLOCK_END\");\n lines.push(\"; EXECUTABLE_BLOCK_START\");\n return lines;\n }\n\n const lines = [\n \"; generated by IgniteFuse\",\n `; printer: ${profiles.printer.name ?? \"unknown\"}`,\n `; flavor: ${profiles.output.flavor}`,\n `; filament_diameter: ${format(profiles.filament.diameter)}`,\n `; nozzle_diameter: ${format(profiles.printer.nozzle)}`,\n ];\n if (profiles.output.metadata.printStats) {\n lines.push(`; layer_count: ${graph.layers.length}`);\n lines.push(`; path_count: ${graph.stats.pathCount}`);\n }\n return lines;\n};\n\nconst customGcodeFeatureComment = (style: GcodeStyle) => {\n if (style === \"orca\" || style === \"bambu\") return \"; FEATURE: Custom\";\n if (style === \"prusa\") return \";TYPE:Custom\";\n if (style === \"ignitefuse\") return \"; custom gcode\";\n return \"\";\n};\n\nconst startBlockEndLines = (profiles: ResolvedGcodeProfiles, start: GcodeStartEndOptions | undefined) => {\n if (profiles.output.style !== \"bambu\" || start?.mode === \"custom\") return [];\n return [\"; MACHINE_START_GCODE_END\"];\n};\n\nconst footerLines = (profiles: ResolvedGcodeProfiles) =>\n profiles.output.style === \"bambu\" ? [\"; EXECUTABLE_BLOCK_END\"] : [];\n\nexport const exportGcode = (graph: ToolpathGraph, options: GcodeExportOptions = {}) => {\n const profiles = resolveProfiles(graph, options);\n const machineFrame = resolveMachineFrame(profiles.printer, options.machineFrame);\n const alignOffset = resolveAlignOffset(graph, machineFrame, options.align);\n const contactMetric = (options.pathOrder ?? (profiles.printer.process ? \"contact\" : \"graph\")) === \"contact\"\n ? contactMetricForPrinter(profiles.printer)\n : undefined;\n const state: EmitterState = {\n extrusion: { e: 0, retracted: false },\n };\n const lines: string[] = [];\n const emit = createEmit(lines, profiles, state);\n const baseContext = hookContext(emit, graph, profiles);\n const jobTemplateContext: GcodeTemplateContext = {\n alignOffset,\n graph,\n machineFrame,\n profiles,\n };\n\n options.hooks?.onJobStart?.(baseContext);\n\n lines.push(...headerLines(graph, profiles));\n\n const exportDiagnostics = validateExport(graph, profiles, machineFrame);\n for (const diagnostic of exportDiagnostics) {\n options.onDiagnostic?.(diagnostic);\n if (options.diagnosticComments) lines.push(`; ${diagnostic.level.toUpperCase()}: ${diagnostic.message}`);\n }\n lines.push(...emitObjectDefinitions(graph, profiles));\n lines.push(customGcodeFeatureComment(profiles.output.style));\n lines.push(...emitStart(profiles, options.start, jobTemplateContext));\n lines.push(...startBlockEndLines(profiles, options.start));\n\n if (hasOffset(alignOffset)) {\n lines.push(`; IgniteFuse: alignOffset X${format(alignOffset.x)} Y${format(alignOffset.y)} Z${format(alignOffset.z)}`);\n }\n\n options.hooks?.onAfterStart?.(baseContext);\n\n for (let layerIndex = 0; layerIndex < graph.layers.length; layerIndex += 1) {\n const layer = graph.layers[layerIndex];\n const previousLayer = graph.layers[layerIndex - 1];\n const layerHeight = previousLayer ? Math.abs(layer.z - previousLayer.z) : layer.paths[0]?.extrusion?.height ?? layer.z;\n const layerTemplateContext: GcodeTemplateContext = {\n alignOffset,\n graph,\n layer,\n layerHeight,\n layerOrdinal: layerIndex + 1,\n machineFrame,\n profiles,\n };\n lines.push(...renderScript(profiles.scripts.beforeLayerChange, layerTemplateContext));\n lines.push(...layerComments(layer, profiles, layerIndex + 1, graph.layers.length, previousLayer));\n lines.push(...renderScript(profiles.scripts.layerChange, layerTemplateContext));\n maybeEmitLayerFan(layer, emit, profiles);\n options.hooks?.onLayerStart?.({ ...baseContext, layer });\n\n let currentRole: ToolpathRole | undefined;\n for (const path of orderedPathsForGcode(layer.paths, contactMetric)) {\n emitObjectBoundary(lines, path.objectId, graph, profiles, state, emit, layer, options.hooks);\n\n if (currentRole !== path.role) {\n const line = typeComment(path.role, profiles.output.style);\n if (line) lines.push(line);\n currentRole = path.role;\n }\n\n const speed = resolvePathSpeed(layer, path, profiles, contactMetric);\n const acceleration = resolvePathAcceleration(layer, path, profiles);\n if (acceleration) emit.setAcceleration(acceleration, `${roleLabel[path.role]} acceleration`);\n options.hooks?.onPathStart?.({ ...baseContext, layer, path });\n emitPathGeometry(path, speed, lines, profiles, state, machineFrame, alignOffset);\n options.hooks?.onPathEnd?.({ ...baseContext, layer, path });\n }\n\n options.hooks?.onLayerEnd?.({ ...baseContext, layer });\n }\n\n emitObjectBoundary(lines, undefined, graph, profiles, state, emit, graph.layers[graph.layers.length - 1], options.hooks);\n emitRetraction(lines, profiles, state, false);\n options.hooks?.onBeforeEnd?.(baseContext);\n const endOptions = options.end ?? (options.start?.mode === \"macro\" && options.start.endMacro\n ? { endMacro: options.start.endMacro, mode: \"macro\" as const, params: options.start.params }\n : undefined);\n lines.push(customGcodeFeatureComment(profiles.output.style));\n lines.push(...emitEnd(profiles, endOptions, jobTemplateContext));\n lines.push(...footerLines(profiles));\n options.hooks?.onJobEnd?.(baseContext);\n\n return `${lines.filter((line) => line.length > 0).join(\"\\n\")}\\n`;\n};\n", "import { readFileSync } from \"node:fs\";\nimport type { Clipper2ZFactoryFunction, MainModule, Path64, Paths64 } from \"clipper2-wasm/dist/clipper2z\";\nimport * as _Clipper2ZFactory from \"clipper2-wasm/dist/umd/clipper2z\";\nimport type { Vec2 } from \"../types\";\n\nexport const CLIPPER_SCALE = 1_000_000;\n\nconst resolveClipperFactory = (candidate: unknown): Clipper2ZFactoryFunction => {\n if (typeof candidate === \"function\") return candidate as Clipper2ZFactoryFunction;\n\n if (candidate && typeof candidate === \"object\") {\n const module = candidate as Record<string, unknown>;\n\n if (typeof module.default === \"function\") return module.default as Clipper2ZFactoryFunction;\n if (typeof module.Clipper2ZFactory === \"function\") return module.Clipper2ZFactory as Clipper2ZFactoryFunction;\n\n const nestedDefault = module.default;\n if (nestedDefault && typeof nestedDefault === \"object\") {\n const nestedModule = nestedDefault as Record<string, unknown>;\n if (typeof nestedModule.default === \"function\") return nestedModule.default as Clipper2ZFactoryFunction;\n }\n }\n\n throw new Error(\"Clipper2-WASM factory could not be resolved.\");\n};\n\nconst Clipper2ZFactory = resolveClipperFactory(_Clipper2ZFactory);\nconst clipperWasmPath = require.resolve(\"clipper2-wasm/dist/umd/clipper2z.wasm\");\n\nlet clipperModule: MainModule | undefined;\nlet clipperModulePromise: Promise<MainModule> | undefined;\n\nexport const initClipperKernel = async () => {\n if (clipperModule) return clipperModule;\n clipperModulePromise ??= Clipper2ZFactory({\n locateFile: (path) => (path.endsWith(\".wasm\") ? clipperWasmPath : path),\n wasmBinary: readFileSync(clipperWasmPath),\n } as Parameters<Clipper2ZFactoryFunction>[0]);\n clipperModule = await clipperModulePromise;\n return clipperModule;\n};\n\nexport const clipperKernel = () => {\n if (!clipperModule) {\n throw new Error(\"Clipper2 kernel is not initialized. Call initClipperKernel() before using geometry kernel operations.\");\n }\n\n return clipperModule;\n};\n\nexport const toClipperCoordinate = (value: number) => BigInt(Math.round(value * CLIPPER_SCALE));\nexport const fromClipperCoordinate = (value: bigint) => Number(value) / CLIPPER_SCALE;\n\nexport const createClipperPath64 = (module: MainModule, points: readonly Vec2[]) => {\n const path = new module.Path64();\n\n for (const point of points) {\n const clipperPoint = new module.Point64(toClipperCoordinate(point[0]), toClipperCoordinate(point[1]), 0n);\n path.push_back(clipperPoint);\n clipperPoint.delete();\n }\n\n return path;\n};\n\nexport const createClipperPaths64 = (module: MainModule, rings: readonly (readonly Vec2[])[]) => {\n const paths = new module.Paths64();\n const ownedPaths: Path64[] = [];\n\n for (const ring of rings) {\n const path = createClipperPath64(module, ring);\n paths.push_back(path);\n ownedPaths.push(path);\n }\n\n return {\n paths,\n release: () => {\n for (const path of ownedPaths) path.delete();\n paths.delete();\n },\n };\n};\n\nexport const clipperPath64ToPoints = (path: Path64): Vec2[] => {\n const points: Vec2[] = [];\n\n for (let index = 0; index < path.size(); index += 1) {\n const point = path.get(index);\n points.push([fromClipperCoordinate(point.x), fromClipperCoordinate(point.y)]);\n point.delete();\n }\n\n return points;\n};\n\nexport const clipperPaths64ToPointLists = (paths: Paths64) => {\n const pointLists: Vec2[][] = [];\n\n for (let index = 0; index < paths.size(); index += 1) {\n const path = paths.get(index);\n pointLists.push(clipperPath64ToPoints(path));\n path.delete();\n }\n\n return pointLists;\n};\n", "import type { Bounds2, Vec2 } from \"../types\";\n\nconst DEFAULT_EPSILON = 1e-5;\n\nexport const distanceSquared2 = (a: Vec2, b: Vec2) => {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n return dx * dx + dy * dy;\n};\n\nexport const signedArea2 = (points: readonly Vec2[]) => {\n let area = 0;\n\n for (let index = 0; index < points.length; index += 1) {\n const current = points[index];\n const next = points[(index + 1) % points.length];\n area += current[0] * next[1] - next[0] * current[1];\n }\n\n return area / 2;\n};\n\nexport const bounds2 = (points: readonly Vec2[]): Bounds2 => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const point of points) {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n }\n\n if (!Number.isFinite(minX)) {\n return {\n min: [0, 0],\n max: [0, 0],\n };\n }\n\n return {\n min: [minX, minY],\n max: [maxX, maxY],\n };\n};\n\nconst cross2 = (a: Vec2, b: Vec2, c: Vec2) => {\n const abx = b[0] - a[0];\n const aby = b[1] - a[1];\n const bcx = c[0] - b[0];\n const bcy = c[1] - b[1];\n return abx * bcy - aby * bcx;\n};\n\nconst removeConsecutiveDuplicates = (points: readonly Vec2[], epsilon: number) => {\n const epsilonSquared = epsilon * epsilon;\n const cleaned: Vec2[] = [];\n\n for (const point of points) {\n const previous = cleaned[cleaned.length - 1];\n if (!previous || distanceSquared2(previous, point) > epsilonSquared) {\n cleaned.push(point);\n }\n }\n\n if (cleaned.length > 1 && distanceSquared2(cleaned[0], cleaned[cleaned.length - 1]) <= epsilonSquared) {\n cleaned.pop();\n }\n\n return cleaned;\n};\n\nexport const dedupeRing2 = (points: readonly Vec2[], epsilon = DEFAULT_EPSILON) => removeConsecutiveDuplicates(points, epsilon);\n\nconst removeCollinearPoints = (points: readonly Vec2[], epsilon: number) => {\n if (points.length < 3) return [...points];\n\n const cleaned: Vec2[] = [];\n\n for (let index = 0; index < points.length; index += 1) {\n const previous = points[(index - 1 + points.length) % points.length];\n const current = points[index];\n const next = points[(index + 1) % points.length];\n\n if (Math.abs(cross2(previous, current, next)) > epsilon) {\n cleaned.push(current);\n }\n }\n\n return cleaned.length >= 3 ? cleaned : [...points];\n};\n\nexport const cleanRing2 = (points: readonly Vec2[], epsilon = DEFAULT_EPSILON) => {\n const withoutDuplicates = removeConsecutiveDuplicates(points, epsilon);\n return removeCollinearPoints(withoutDuplicates, epsilon);\n};\n", "import type { Vec2 } from \"../types\";\n\nconst orientation = (a: Vec2, b: Vec2, c: Vec2) => {\n const value = (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n return value;\n};\n\nconst onSegment = (a: Vec2, b: Vec2, c: Vec2, epsilon: number) =>\n Math.min(a[0], c[0]) - epsilon <= b[0] &&\n b[0] <= Math.max(a[0], c[0]) + epsilon &&\n Math.min(a[1], c[1]) - epsilon <= b[1] &&\n b[1] <= Math.max(a[1], c[1]) + epsilon;\n\nexport const segmentsIntersect2 = (a1: Vec2, a2: Vec2, b1: Vec2, b2: Vec2, epsilon = 1e-9) => {\n const o1 = orientation(a1, a2, b1);\n const o2 = orientation(a1, a2, b2);\n const o3 = orientation(b1, b2, a1);\n const o4 = orientation(b1, b2, a2);\n\n if (Math.abs(o1) <= epsilon && onSegment(a1, b1, a2, epsilon)) return true;\n if (Math.abs(o2) <= epsilon && onSegment(a1, b2, a2, epsilon)) return true;\n if (Math.abs(o3) <= epsilon && onSegment(b1, a1, b2, epsilon)) return true;\n if (Math.abs(o4) <= epsilon && onSegment(b1, a2, b2, epsilon)) return true;\n\n return (o1 > 0) !== (o2 > 0) && (o3 > 0) !== (o4 > 0);\n};\n\nconst areAdjacentClosedEdges = (edgeA: number, edgeB: number, edgeCount: number) =>\n edgeA === edgeB ||\n Math.abs(edgeA - edgeB) === 1 ||\n (edgeA === 0 && edgeB === edgeCount - 1) ||\n (edgeB === 0 && edgeA === edgeCount - 1);\n\nexport const findSelfIntersections2 = (ring: readonly Vec2[], epsilon = 1e-9) => {\n const intersections: Array<[number, number]> = [];\n\n for (let aIndex = 0; aIndex < ring.length; aIndex += 1) {\n const aStart = ring[aIndex];\n const aEnd = ring[(aIndex + 1) % ring.length];\n\n for (let bIndex = aIndex + 1; bIndex < ring.length; bIndex += 1) {\n if (areAdjacentClosedEdges(aIndex, bIndex, ring.length)) continue;\n\n const bStart = ring[bIndex];\n const bEnd = ring[(bIndex + 1) % ring.length];\n if (segmentsIntersect2(aStart, aEnd, bStart, bEnd, epsilon)) {\n intersections.push([aIndex, bIndex]);\n }\n }\n }\n\n return intersections;\n};\n", "import type { Paths64 } from \"clipper2-wasm/dist/clipper2z\";\nimport type { Vec2 } from \"../types\";\nimport { CLIPPER_SCALE, clipperKernel, clipperPath64ToPoints, createClipperPaths64, initClipperKernel } from \"./clipper\";\nimport { cleanRing2, dedupeRing2, signedArea2 } from \"./cleanup\";\nimport { findSelfIntersections2 } from \"./intersections\";\n\nexport { initClipperKernel };\n\nexport type OffsetSide = \"inward\" | \"outward\";\n\nexport type OffsetOptions = {\n areaEpsilon?: number;\n distanceEpsilon?: number;\n miterLimit?: number;\n side?: OffsetSide;\n};\n\nexport type OffsetRegionRing = {\n points: readonly Vec2[];\n role?: \"hole\" | \"innerWall\" | \"invalid\" | \"island\" | \"open\" | \"outer\" | \"unknown\";\n};\n\nexport type OffsetResult =\n | {\n ok: true;\n points: Vec2[];\n warnings: string[];\n }\n | {\n ok: false;\n reason: string;\n warnings: string[];\n };\n\nexport type OffsetMultiResult =\n | {\n ok: true;\n rings: Vec2[][];\n warnings: string[];\n }\n | {\n ok: false;\n reason: string;\n warnings: string[];\n };\n\nconst DEFAULT_AREA_EPSILON = 1e-6;\nconst DEFAULT_DISTANCE_EPSILON = 1e-5;\nconst DEFAULT_MITER_LIMIT = 1.5;\nconst CLIPPER_ARC_TOLERANCE = 0;\n\nconst samePoint = (a: Vec2, b: Vec2, epsilon: number) => {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n return dx * dx + dy * dy <= epsilon * epsilon;\n};\n\nconst normalizeOrientation = (ring: Vec2[], positive: boolean) => {\n const area = signedArea2(ring);\n if ((positive && area < 0) || (!positive && area > 0)) return [...ring].reverse();\n return ring;\n};\n\nconst cleanupOutputRing = (ring: Vec2[], distanceEpsilon: number) => {\n const cleaned = dedupeRing2(ring, distanceEpsilon);\n if (cleaned.length > 1 && samePoint(cleaned[0], cleaned[cleaned.length - 1], distanceEpsilon)) {\n cleaned.pop();\n }\n return cleaned;\n};\n\nconst validOutputRings = (rings: Vec2[][], areaEpsilon: number, distanceEpsilon: number) =>\n rings\n .map((ring) => cleanupOutputRing(ring, distanceEpsilon))\n .filter((ring) => ring.length >= 3 && Math.abs(signedArea2(ring)) > areaEpsilon);\n\nconst pathsToRings = (paths: Paths64, areaEpsilon: number, distanceEpsilon: number) => {\n const rings: Vec2[][] = [];\n\n for (let index = 0; index < paths.size(); index += 1) {\n const path = paths.get(index);\n rings.push(clipperPath64ToPoints(path));\n path.delete();\n }\n\n return validOutputRings(rings, areaEpsilon, distanceEpsilon);\n};\n\nconst inflatePaths = (\n rings: readonly (readonly Vec2[])[],\n delta: number,\n options: OffsetOptions,\n): OffsetMultiResult => {\n const module = clipperKernel();\n const areaEpsilon = options.areaEpsilon ?? DEFAULT_AREA_EPSILON;\n const distanceEpsilon = options.distanceEpsilon ?? DEFAULT_DISTANCE_EPSILON;\n const miterLimit = options.miterLimit ?? DEFAULT_MITER_LIMIT;\n const source = createClipperPaths64(module, rings);\n let result: Paths64 | undefined;\n\n try {\n const scaledDelta = Math.round(delta * CLIPPER_SCALE);\n\n result = module.InflatePaths64(\n source.paths,\n scaledDelta,\n module.JoinType.Miter,\n module.EndType.Polygon,\n miterLimit,\n CLIPPER_ARC_TOLERANCE,\n );\n\n const outputRings = pathsToRings(result, areaEpsilon, distanceEpsilon);\n if (outputRings.length === 0) {\n return {\n ok: false,\n reason: \"offset region collapsed after Clipper2 cleanup\",\n warnings: [],\n };\n }\n\n return {\n ok: true,\n rings: outputRings,\n warnings: [],\n };\n } finally {\n result?.delete();\n source.release();\n }\n};\n\nexport const offsetClosedRing2MultiResult = (\n ring: readonly Vec2[],\n distanceValue: number,\n options: OffsetOptions = {},\n): OffsetMultiResult => {\n const distanceEpsilon = options.distanceEpsilon ?? DEFAULT_DISTANCE_EPSILON;\n const areaEpsilon = options.areaEpsilon ?? DEFAULT_AREA_EPSILON;\n const side = options.side ?? \"inward\";\n const distanceMagnitude = Math.abs(distanceValue);\n const source = dedupeRing2(ring, distanceEpsilon);\n\n if (source.length < 3) {\n return { ok: false, reason: \"source ring collapsed below 3 points\", warnings: [] };\n }\n\n const sourceArea = signedArea2(source);\n if (Math.abs(sourceArea) <= areaEpsilon) {\n return { ok: false, reason: \"source ring collapsed to near-zero area\", warnings: [] };\n }\n\n const sourceIntersections = findSelfIntersections2(source, distanceEpsilon);\n if (sourceIntersections.length > 0) {\n return {\n ok: false,\n reason: `source ring has ${sourceIntersections.length} self intersections`,\n warnings: [],\n };\n }\n\n if (distanceMagnitude <= distanceEpsilon) {\n return {\n ok: true,\n rings: [source],\n warnings: [],\n };\n }\n\n const orientationSign = sourceArea >= 0 ? 1 : -1;\n const delta = (side === \"inward\" ? -orientationSign : orientationSign) * distanceMagnitude;\n return inflatePaths([source], delta, options);\n};\n\nexport const offsetRegionRings2 = (\n regionRings: readonly OffsetRegionRing[],\n distanceValue: number,\n options: OffsetOptions = {},\n): OffsetMultiResult => {\n const distanceEpsilon = options.distanceEpsilon ?? DEFAULT_DISTANCE_EPSILON;\n const areaEpsilon = options.areaEpsilon ?? DEFAULT_AREA_EPSILON;\n const distanceMagnitude = Math.abs(distanceValue);\n\n if (distanceMagnitude <= distanceEpsilon) {\n const rings = validOutputRings(regionRings.map((ring) => [...ring.points]), areaEpsilon, distanceEpsilon);\n return rings.length > 0\n ? { ok: true, rings, warnings: [] }\n : { ok: false, reason: \"region collapsed below 3 points\", warnings: [] };\n }\n\n const rings = regionRings.flatMap((ring): Vec2[][] => {\n if (ring.role === \"invalid\" || ring.role === \"open\") return [];\n const cleaned = dedupeRing2(ring.points, distanceEpsilon);\n if (cleaned.length < 3 || Math.abs(signedArea2(cleaned)) <= areaEpsilon) return [];\n const positive = ring.role !== \"hole\";\n return [normalizeOrientation(cleaned, positive)];\n });\n\n if (rings.length === 0) {\n return { ok: false, reason: \"region has no valid rings\", warnings: [] };\n }\n\n return inflatePaths(rings, -distanceMagnitude, options);\n};\n\nexport const offsetClosedRing2Result = (\n ring: readonly Vec2[],\n distanceValue: number,\n options: OffsetOptions = {},\n): OffsetResult => {\n const multi = offsetClosedRing2MultiResult(ring, distanceValue, options);\n if (multi.ok === false) {\n return {\n ok: false,\n reason: multi.reason,\n warnings: multi.warnings,\n };\n }\n\n if (multi.rings.length > 1) {\n return {\n ok: false,\n reason: `offset produced ${multi.rings.length} rings; use offsetClosedRing2MultiResult`,\n warnings: multi.warnings,\n };\n }\n\n return {\n ok: true,\n points: multi.rings[0],\n warnings: multi.warnings,\n };\n};\n\nexport const offsetClosedRing2 = (ring: readonly Vec2[], distanceValue: number, options: OffsetOptions = {}) => {\n const result = offsetClosedRing2Result(ring, distanceValue, options);\n return result.ok ? result.points : null;\n};\n", "import type { Vec2 } from \"../types\";\nimport { bounds2, cleanRing2, signedArea2 } from \"./cleanup\";\nimport type { KernelClassificationOptions, KernelContour } from \"./types\";\n\nconst DEFAULT_AREA_EPSILON = 1e-6;\nconst DEFAULT_DISTANCE_EPSILON = 1e-5;\n\nexport const pointInPolygon2 = (point: Vec2, polygon: readonly Vec2[]) => {\n let inside = false;\n\n for (let index = 0, previousIndex = polygon.length - 1; index < polygon.length; previousIndex = index, index += 1) {\n const current = polygon[index];\n const previous = polygon[previousIndex];\n const intersects =\n current[1] > point[1] !== previous[1] > point[1] &&\n point[0] < ((previous[0] - current[0]) * (point[1] - current[1])) / (previous[1] - current[1]) + current[0];\n\n if (intersects) inside = !inside;\n }\n\n return inside;\n};\n\nconst representativePoint = (points: readonly Vec2[]) => points[0] ?? null;\n\nconst boundsContainsPoint = (bounds: KernelContour[\"bounds\"], point: Vec2) =>\n point[0] >= bounds.min[0] && point[0] <= bounds.max[0] && point[1] >= bounds.min[1] && point[1] <= bounds.max[1];\n\nconst boundsContainsBounds = (outer: KernelContour[\"bounds\"], inner: KernelContour[\"bounds\"]) =>\n inner.min[0] >= outer.min[0] && inner.max[0] <= outer.max[0] && inner.min[1] >= outer.min[1] && inner.max[1] <= outer.max[1];\n\nconst roleForDepth = (depth: number) => {\n if (depth % 2 === 1) return \"hole\" as const;\n return depth === 0 ? (\"outer\" as const) : (\"island\" as const);\n};\n\nconst normalizeWinding = (points: Vec2[], depth: number) => {\n const shouldBeCcw = depth % 2 === 0;\n const area = signedArea2(points);\n const isCcw = area >= 0;\n\n return shouldBeCcw === isCcw ? points : [...points].reverse();\n};\n\nexport const classifyContours = (\n rings: readonly (readonly Vec2[])[],\n options: KernelClassificationOptions = {},\n): KernelContour[] => {\n const areaEpsilon = options.areaEpsilon ?? DEFAULT_AREA_EPSILON;\n const distanceEpsilon = options.distanceEpsilon ?? DEFAULT_DISTANCE_EPSILON;\n const baseContours: KernelContour[] = rings.map((ring, sourceIndex) => {\n const points = cleanRing2(ring, distanceEpsilon);\n const area = signedArea2(points);\n\n return {\n area,\n bounds: bounds2(points),\n childIds: [] as string[],\n depth: 0,\n id: `contour-${sourceIndex}`,\n points,\n role: points.length < 3 || Math.abs(area) <= areaEpsilon ? (\"invalid\" as const) : (\"outer\" as const),\n sourceIndex,\n winding: area >= 0 ? (\"ccw\" as const) : (\"cw\" as const),\n } satisfies KernelContour;\n });\n\n const validContours = baseContours.filter((contour) => contour.role !== \"invalid\");\n\n for (const contour of validContours) {\n const point = representativePoint(contour.points);\n if (!point) continue;\n\n const parents = validContours\n .filter(\n (candidate) =>\n candidate.sourceIndex !== contour.sourceIndex &&\n Math.abs(candidate.area) > Math.abs(contour.area) &&\n boundsContainsBounds(candidate.bounds, contour.bounds) &&\n boundsContainsPoint(candidate.bounds, point) &&\n pointInPolygon2(point, candidate.points),\n )\n .sort((a, b) => Math.abs(a.area) - Math.abs(b.area));\n\n const parent = parents[0];\n contour.parentId = parent?.id;\n contour.depth = parents.length;\n }\n\n for (const contour of validContours) {\n contour.role = roleForDepth(contour.depth);\n contour.points = normalizeWinding(contour.points, contour.depth);\n contour.area = signedArea2(contour.points);\n contour.winding = contour.area >= 0 ? \"ccw\" : \"cw\";\n contour.bounds = bounds2(contour.points);\n }\n\n const byId = new Map(validContours.map((contour) => [contour.id, contour]));\n for (const contour of validContours) {\n if (contour.parentId) {\n byId.get(contour.parentId)?.childIds.push(contour.id);\n }\n }\n\n return baseContours;\n};\n", "import type { Vec2 } from \"../types\";\nimport type { Segment2 } from \"./types\";\nimport { clipperKernel, clipperPaths64ToPointLists, createClipperPaths64 } from \"./clipper\";\n\ntype LineClipOptions = {\n epsilon?: number;\n minLength?: number;\n};\n\nconst DEFAULT_EPSILON = 1e-7;\nconst PARALLEL_EPSILON = 1e-9;\n\nconst lerp = (a: Vec2, b: Vec2, t: number): Vec2 => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];\n\nconst distance = (a: Vec2, b: Vec2) => Math.hypot(b[0] - a[0], b[1] - a[1]);\n\nconst lineParameter = (segment: Segment2, point: Vec2) => {\n const dx = segment.end[0] - segment.start[0];\n const dy = segment.end[1] - segment.start[1];\n const lengthSquared = dx * dx + dy * dy;\n if (lengthSquared <= 0) return 0;\n return ((point[0] - segment.start[0]) * dx + (point[1] - segment.start[1]) * dy) / lengthSquared;\n};\n\nconst orderedSegment = (segment: Segment2, start: Vec2, end: Vec2): Segment2 => {\n const startT = lineParameter(segment, start);\n const endT = lineParameter(segment, end);\n return startT <= endT ? { start, end } : { start: end, end: start };\n};\n\nconst distanceToLineSquared = (segment: Segment2, point: Vec2) => {\n const dx = segment.end[0] - segment.start[0];\n const dy = segment.end[1] - segment.start[1];\n const lengthSquared = dx * dx + dy * dy;\n if (lengthSquared <= 0) return Number.POSITIVE_INFINITY;\n const cross = dx * (point[1] - segment.start[1]) - dy * (point[0] - segment.start[0]);\n return (cross * cross) / lengthSquared;\n};\n\nconst nearestSourceSegmentIndex = (segments: readonly Segment2[], points: readonly Vec2[]) => {\n const midpoint = points.length > 1 ? lerp(points[0], points[points.length - 1], 0.5) : points[0];\n let bestIndex = 0;\n let bestScore = Number.POSITIVE_INFINITY;\n\n for (let index = 0; index < segments.length; index += 1) {\n const segment = segments[index];\n const midpointT = lineParameter(segment, midpoint);\n const outsidePenalty = midpointT < 0 ? midpointT * midpointT : midpointT > 1 ? (midpointT - 1) * (midpointT - 1) : 0;\n const score = distanceToLineSquared(segment, midpoint) + outsidePenalty;\n if (score < bestScore) {\n bestIndex = index;\n bestScore = score;\n }\n }\n\n return bestIndex;\n};\n\ntype ClippedSegment = Segment2 & {\n orderOffset: number;\n orderT: number;\n};\n\nconst createParallelSegmentNormalizer = (segments: readonly Segment2[], epsilon: number) => {\n const first = segments[0];\n const firstDx = first.end[0] - first.start[0];\n const firstDy = first.end[1] - first.start[1];\n const firstLength = Math.hypot(firstDx, firstDy);\n if (firstLength <= epsilon) return undefined;\n\n const direction = [firstDx / firstLength, firstDy / firstLength] as const;\n const normal = [-direction[1], direction[0]] as const;\n\n for (const segment of segments) {\n const dx = segment.end[0] - segment.start[0];\n const dy = segment.end[1] - segment.start[1];\n const length = Math.hypot(dx, dy);\n if (length <= epsilon) return undefined;\n\n const cross = (dx / length) * direction[1] - (dy / length) * direction[0];\n if (Math.abs(cross) > PARALLEL_EPSILON) return undefined;\n }\n\n return (start: Vec2, end: Vec2): ClippedSegment => {\n const segmentDirection = (end[0] - start[0]) * direction[0] + (end[1] - start[1]) * direction[1];\n const ordered = segmentDirection >= 0 ? { start, end } : { start: end, end: start };\n const midpoint = lerp(ordered.start, ordered.end, 0.5);\n\n return {\n ...ordered,\n orderOffset: midpoint[0] * normal[0] + midpoint[1] * normal[1],\n orderT: ordered.start[0] * direction[0] + ordered.start[1] * direction[1],\n };\n };\n};\n\nconst createSegmentNormalizer = (segments: readonly Segment2[], epsilon: number) => {\n const parallelNormalizer = createParallelSegmentNormalizer(segments, epsilon);\n if (parallelNormalizer) return parallelNormalizer;\n\n return (start: Vec2, end: Vec2, points: readonly Vec2[]): ClippedSegment => {\n const sourceIndex = nearestSourceSegmentIndex(segments, points);\n const source = segments[sourceIndex];\n const ordered = orderedSegment(source, start, end);\n\n return {\n ...ordered,\n orderOffset: sourceIndex,\n orderT: lineParameter(source, ordered.start),\n };\n };\n};\n\nexport const clipSegmentsToPolygons = (\n segments: readonly Segment2[],\n polygons: readonly (readonly Vec2[])[],\n containsPoint: (point: Vec2) => boolean,\n options: LineClipOptions = {},\n): Segment2[] => {\n const epsilon = options.epsilon ?? DEFAULT_EPSILON;\n const minLength = options.minLength ?? epsilon;\n const validSegments = segments.filter((segment) => distance(segment.start, segment.end) >= minLength);\n const validPolygons = polygons.filter((polygon) => polygon.length >= 3);\n if (validSegments.length === 0 || validPolygons.length === 0) return [];\n\n const module = clipperKernel();\n const subject = createClipperPaths64(\n module,\n validSegments.map((segment) => [segment.start, segment.end]),\n );\n const clip = createClipperPaths64(module, validPolygons);\n const clipper = new module.Clipper64();\n const closedSolution = new module.Paths64();\n const openSolution = new module.Paths64();\n const clipped: ClippedSegment[] = [];\n const normalizeSegment = createSegmentNormalizer(validSegments, epsilon);\n\n try {\n clipper.AddOpenSubject(subject.paths);\n clipper.AddClip(clip.paths);\n clipper.ExecutePath(module.ClipType.Intersection, module.FillRule.EvenOdd, closedSolution, openSolution);\n\n for (const points of clipperPaths64ToPointLists(openSolution)) {\n if (points.length < 2) continue;\n\n for (let index = 1; index < points.length; index += 1) {\n const start = points[index - 1];\n const end = points[index];\n if (distance(start, end) < minLength) continue;\n\n const candidate = normalizeSegment(start, end, points);\n const midpoint = lerp(candidate.start, candidate.end, 0.5);\n if (!containsPoint(midpoint)) continue;\n clipped.push(candidate);\n }\n }\n } finally {\n closedSolution.delete();\n openSolution.delete();\n clipper.delete();\n clip.release();\n subject.release();\n }\n\n return clipped\n .sort((a, b) => a.orderOffset - b.orderOffset || a.orderT - b.orderT)\n .map(({ orderOffset: _orderOffset, orderT: _orderT, ...segment }) => segment);\n};\n\nexport const clipSegmentToPolygons = (\n segment: Segment2,\n polygons: readonly (readonly Vec2[])[],\n containsPoint: (point: Vec2) => boolean,\n options: LineClipOptions = {},\n): Segment2[] => clipSegmentsToPolygons([segment], polygons, containsPoint, options);\n", "import type { Vec2 } from \"../types\";\nimport { classifyContours, pointInPolygon2 } from \"./classify\";\nimport { findSelfIntersections2 } from \"./intersections\";\nimport { clipSegmentToPolygons } from \"./lineClip\";\nimport { offsetClosedRing2, offsetClosedRing2MultiResult, offsetClosedRing2Result } from \"./offset\";\n\nexport type KernelValidationIssue = {\n level: \"error\" | \"warning\";\n message: string;\n};\n\nconst rectangle: Vec2[] = [\n [0, 0],\n [20, 0],\n [20, 10],\n [0, 10],\n];\n\nconst hole: Vec2[] = [\n [6, 3],\n [14, 3],\n [14, 7],\n [6, 7],\n];\n\nconst concave: Vec2[] = [\n [0, 0],\n [16, 0],\n [16, 5],\n [9, 5],\n [9, 10],\n [0, 10],\n];\n\nconst bowtie: Vec2[] = [\n [0, 0],\n [10, 10],\n [0, 10],\n [10, 0],\n];\n\nconst tJunction: Vec2[] = [\n [0, 0],\n [12, 0],\n [12, 3],\n [7, 3],\n [7, 10],\n [5, 10],\n [5, 3],\n [0, 3],\n];\n\nconst fail = (condition: boolean, message: string): KernelValidationIssue[] =>\n condition ? [] : [{ level: \"error\", message }];\n\nexport const validateKernelSmokeFixtures = (): KernelValidationIssue[] => {\n const issues: KernelValidationIssue[] = [];\n const classified = classifyContours([rectangle, hole]);\n\n issues.push(\n ...fail(classified.filter((contour) => contour.role === \"outer\").length === 1, \"Expected one outer contour.\"),\n );\n issues.push(\n ...fail(classified.filter((contour) => contour.role === \"hole\").length === 1, \"Expected one hole contour.\"),\n );\n\n const containsClassifiedRegion = (point: Vec2) =>\n classified.filter(\n (contour) => contour.role !== \"invalid\" && contour.points.length >= 3 && pointInPolygon2(point, contour.points),\n ).length %\n 2 ===\n 1;\n\n const clipped = clipSegmentToPolygons(\n {\n start: [-1, 5],\n end: [21, 5],\n },\n [rectangle, hole],\n containsClassifiedRegion,\n );\n issues.push(...fail(clipped.length === 2, \"Expected scan line through holed rectangle to produce two fill segments.\"));\n\n const insetRectangle = offsetClosedRing2(rectangle, 1, { side: \"inward\" });\n issues.push(...fail(Boolean(insetRectangle && insetRectangle.length === 4), \"Expected rectangle inset to produce a valid ring.\"));\n\n const insetConcave = offsetClosedRing2(concave, 0.5, { side: \"inward\" });\n issues.push(...fail(Boolean(insetConcave && insetConcave.length >= 4), \"Expected concave inset to produce a valid ring.\"));\n\n const insetTJunction = offsetClosedRing2MultiResult(tJunction, 1.2, { side: \"inward\" });\n issues.push(...fail(insetTJunction.ok && insetTJunction.rings.length === 1, \"Expected T-junction inset to remove collapsed stem.\"));\n\n issues.push(...fail(findSelfIntersections2(bowtie).length === 1, \"Expected bowtie fixture to report one self intersection.\"));\n\n const invalidOffset = offsetClosedRing2Result(bowtie, 0.5, { side: \"inward\" });\n issues.push(...fail(!invalidOffset.ok, \"Expected self-intersecting source ring to be rejected.\"));\n\n return issues;\n};\n", "import type { Bounds3, Vec3 } from \"../geometry/types\";\nimport type { MeshTriangle } from \"./types\";\n\nconst emptyBounds = (): Bounds3 => ({\n min: [Infinity, Infinity, Infinity],\n max: [-Infinity, -Infinity, -Infinity],\n});\n\nconst includePoint = (bounds: Bounds3, point: Vec3): Bounds3 => ({\n min: [\n Math.min(bounds.min[0], point[0]),\n Math.min(bounds.min[1], point[1]),\n Math.min(bounds.min[2], point[2]),\n ],\n max: [\n Math.max(bounds.max[0], point[0]),\n Math.max(bounds.max[1], point[1]),\n Math.max(bounds.max[2], point[2]),\n ],\n});\n\nexport const calculateMeshBounds = (triangles: MeshTriangle[]): Bounds3 => {\n let bounds = emptyBounds();\n\n for (const triangle of triangles) {\n bounds = includePoint(includePoint(includePoint(bounds, triangle.a), triangle.b), triangle.c);\n }\n\n if (triangles.length === 0) {\n return {\n min: [0, 0, 0],\n max: [0, 0, 0],\n };\n }\n\n return bounds;\n};\n", "import { calculateMeshBounds } from \"./bounds\";\nimport type { Mesh, MeshTriangle } from \"./types\";\n\nconst decoder = new TextDecoder();\n\nconst readVec3 = (view: DataView, offset: number): [number, number, number] => [\n view.getFloat32(offset, true),\n view.getFloat32(offset + 4, true),\n view.getFloat32(offset + 8, true),\n];\n\nconst isBinaryStl = (bytes: Uint8Array) => {\n if (bytes.byteLength < 84) return false;\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const triangleCount = view.getUint32(80, true);\n return 84 + triangleCount * 50 === bytes.byteLength;\n};\n\nconst parseBinaryStl = (bytes: Uint8Array): MeshTriangle[] => {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const triangleCount = view.getUint32(80, true);\n const triangles: MeshTriangle[] = [];\n\n for (let i = 0; i < triangleCount; i += 1) {\n const offset = 84 + i * 50;\n triangles.push({\n normal: readVec3(view, offset),\n a: readVec3(view, offset + 12),\n b: readVec3(view, offset + 24),\n c: readVec3(view, offset + 36),\n });\n }\n\n return triangles;\n};\n\nconst parseAsciiStl = (bytes: Uint8Array): MeshTriangle[] => {\n const text = decoder.decode(bytes);\n const vertexPattern =\n /vertex\\s+([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)\\s+([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)\\s+([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)/gi;\n const vertices: Array<[number, number, number]> = [];\n const triangles: MeshTriangle[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = vertexPattern.exec(text))) {\n vertices.push([Number(match[1]), Number(match[2]), Number(match[3])]);\n }\n\n for (let i = 0; i + 2 < vertices.length; i += 3) {\n triangles.push({\n a: vertices[i],\n b: vertices[i + 1],\n c: vertices[i + 2],\n });\n }\n\n return triangles;\n};\n\nexport const parseStl = (bytes: Uint8Array, sourcePath?: string): Mesh => {\n const triangles = isBinaryStl(bytes) ? parseBinaryStl(bytes) : parseAsciiStl(bytes);\n\n return {\n id: sourcePath ?? \"stl\",\n sourcePath,\n triangles,\n bounds: calculateMeshBounds(triangles),\n };\n};\n", "import { calculateMeshBounds } from \"./bounds\";\nimport type { Mesh } from \"./types\";\nimport type { Vec3 } from \"../geometry/types\";\n\nconst translatePoint = (point: Vec3, offset: Vec3): Vec3 => [\n point[0] + offset[0],\n point[1] + offset[1],\n point[2] + offset[2],\n];\n\nconst transformPoint = (\n point: Vec3,\n placement: {\n position: Vec3;\n rotation: Vec3;\n scale: Vec3;\n },\n): Vec3 => {\n let x = point[0] * placement.scale[0];\n let y = point[1] * placement.scale[1];\n let z = point[2] * placement.scale[2];\n const [rx, ry, rz] = placement.rotation;\n\n if (rx !== 0) {\n const cos = Math.cos(rx);\n const sin = Math.sin(rx);\n const nextY = y * cos - z * sin;\n const nextZ = y * sin + z * cos;\n y = nextY;\n z = nextZ;\n }\n\n if (ry !== 0) {\n const cos = Math.cos(ry);\n const sin = Math.sin(ry);\n const nextX = x * cos + z * sin;\n const nextZ = -x * sin + z * cos;\n x = nextX;\n z = nextZ;\n }\n\n if (rz !== 0) {\n const cos = Math.cos(rz);\n const sin = Math.sin(rz);\n const nextX = x * cos - y * sin;\n const nextY = x * sin + y * cos;\n x = nextX;\n y = nextY;\n }\n\n return [\n x + placement.position[0],\n y + placement.position[1],\n z + placement.position[2],\n ];\n};\n\nexport const translateMesh = (mesh: Mesh, offset: Vec3): Mesh => {\n const triangles = mesh.triangles.map((triangle) => ({\n ...triangle,\n a: translatePoint(triangle.a, offset),\n b: translatePoint(triangle.b, offset),\n c: translatePoint(triangle.c, offset),\n }));\n\n return {\n ...mesh,\n triangles,\n bounds: calculateMeshBounds(triangles),\n };\n};\n\nexport const transformMesh = (\n mesh: Mesh,\n placement: {\n position: Vec3;\n rotation: Vec3;\n scale: Vec3;\n },\n): Mesh => {\n const triangles = mesh.triangles.map((triangle) => ({\n a: transformPoint(triangle.a, placement),\n b: transformPoint(triangle.b, placement),\n c: transformPoint(triangle.c, placement),\n }));\n\n return {\n ...mesh,\n triangles,\n bounds: calculateMeshBounds(triangles),\n };\n};\n\nexport const placeMeshOnBed = (mesh: Mesh): Mesh => {\n const centerX = (mesh.bounds.min[0] + mesh.bounds.max[0]) / 2;\n const centerY = (mesh.bounds.min[1] + mesh.bounds.max[1]) / 2;\n\n return translateMesh(mesh, [-centerX, -centerY, -mesh.bounds.min[2]]);\n};\n", "import { classifyContours } from \"../geometry/kernel/classify\";\nimport { bounds2, signedArea2 } from \"../geometry/kernel/cleanup\";\nimport type { Vec2, Vec3 } from \"../geometry/types\";\nimport type { Section, SectionCurve } from \"./types\";\n\nconst toPoint3 = (section: Section, point: Vec2): Vec3 => [\n section.frame.origin[0] + section.frame.xAxis[0] * point[0] + section.frame.yAxis[0] * point[1],\n section.frame.origin[1] + section.frame.xAxis[1] * point[0] + section.frame.yAxis[1] * point[1],\n section.frame.origin[2] + section.frame.xAxis[2] * point[0] + section.frame.yAxis[2] * point[1],\n];\n\nexport const classifySectionCurves = (section: Section, curves: SectionCurve[]): SectionCurve[] => {\n const classified = classifyContours(curves.map((curve) => curve.points2));\n\n return classified.map((contour, index) => {\n const sourceCurve = curves[contour.sourceIndex] ?? curves[index];\n const points2 = sourceCurve.points2.length >= 3 ? sourceCurve.points2 : contour.points;\n const points3 =\n sourceCurve.points3.length === points2.length ? sourceCurve.points3 : points2.map((point) => toPoint3(section, point));\n const area = signedArea2(points2);\n\n return {\n ...sourceCurve,\n area,\n bounds: bounds2(points2),\n childIds: contour.childIds,\n closed: contour.role !== \"open\",\n depth: contour.depth,\n id: `curve-${index}`,\n parentId: contour.parentId,\n points2,\n points3,\n role: contour.role,\n winding: area >= 0 ? \"ccw\" : \"cw\",\n } satisfies SectionCurve;\n });\n};\n", "export const DEFAULT_SLICE_CLOSING_RADIUS = 0.049;\n", "import { segmentsIntersect2 } from \"../geometry/kernel/intersections\";\nimport type { Vec2, Vec3 } from \"../geometry/types\";\nimport type { Section, SectionCurve, SectionEndpointReference, SectionIntersectionLine, SliceOptions } from \"./types\";\nimport { classifySectionCurves } from \"./classify\";\nimport { DEFAULT_SLICE_CLOSING_RADIUS } from \"./defaults\";\n\nconst BASE_CONNECT_EPSILON = 1e-4;\nconst AREA_EPSILON = 1e-6;\nconst INTERSECTION_EPSILON = 1e-7;\n\ntype ConnectSegment = SectionCurve | SectionIntersectionLine;\n\ntype EndpointAddress = {\n edgeId?: number;\n key: string;\n point2: Vec2;\n point3: Vec3;\n pointId?: number;\n ref?: SectionEndpointReference;\n};\n\ntype Line = {\n end: EndpointAddress;\n id: number;\n noSeed: boolean;\n skip: boolean;\n start: EndpointAddress;\n triangleIndex?: number;\n};\n\ntype OrientedLine = {\n enter: EndpointAddress;\n exit: EndpointAddress;\n line: Line;\n};\n\ntype Chain = {\n end: EndpointAddress;\n lineIds: number[];\n points2: Vec2[];\n points3: Vec3[];\n start: EndpointAddress;\n};\n\ntype MakeLoopsResult = {\n ambiguousEndpointCount: number;\n closedChains: Chain[];\n discardedShortNearClosedChainCount: number;\n duplicateCount: number;\n exactMergedChainCount: number;\n gapClosedChainCount: number;\n nearMergeAmbiguousCount: number;\n nearMergeCandidateCount: number;\n nearMergedChainCount: number;\n openGapMax: number;\n openGapMin: number;\n openChains: Chain[];\n pairedLineCount: number;\n rejectedClosedChainCount: number;\n selfTouchCount: number;\n shortNearClosedChainCount: number;\n zeroLengthCount: number;\n};\n\nconst isIntersectionLine = (segment: ConnectSegment): segment is SectionIntersectionLine => typeof segment.id === \"number\";\n\nconst distance2 = (a: Vec2, b: Vec2) => {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n return Math.sqrt(dx * dx + dy * dy);\n};\n\nconst samePoint = (a: Vec2, b: Vec2, epsilon: number) => distance2(a, b) <= epsilon;\n\nconst pointKey = (point: Vec2, epsilon: number) => `${Math.round(point[0] / epsilon)},${Math.round(point[1] / epsilon)}`;\n\nconst signedArea = (points: Vec2[]) => {\n let area = 0;\n\n for (let index = 0; index < points.length; index += 1) {\n const current = points[index];\n const next = points[(index + 1) % points.length];\n area += current[0] * next[1] - next[0] * current[1];\n }\n\n return area / 2;\n};\n\nconst chainSelfIntersects = (points: Vec2[], epsilon: number) => {\n if (points.length < 4) return false;\n\n for (let aIndex = 0; aIndex < points.length; aIndex += 1) {\n const aStart = points[aIndex];\n const aEnd = points[(aIndex + 1) % points.length];\n\n for (let bIndex = aIndex + 1; bIndex < points.length; bIndex += 1) {\n const adjacent =\n bIndex === aIndex ||\n bIndex === aIndex + 1 ||\n (aIndex === 0 && bIndex === points.length - 1);\n if (adjacent) continue;\n\n const bStart = points[bIndex];\n const bEnd = points[(bIndex + 1) % points.length];\n if (segmentsIntersect2(aStart, aEnd, bStart, bEnd, epsilon)) return true;\n }\n }\n\n return false;\n};\n\nconst chainIsGeometricallyClosed = (chain: Chain, epsilon: number) => {\n if (chain.points2.length < 2) return false;\n return samePoint(chain.points2[0], chain.points2[chain.points2.length - 1], epsilon);\n};\n\nconst normalizeClosedChain = (chain: Chain, epsilon = BASE_CONNECT_EPSILON): Chain => {\n if (chain.points2.length < 2) return chain;\n const first = chain.points2[0];\n const last = chain.points2[chain.points2.length - 1];\n if (!samePoint(first, last, epsilon)) return chain;\n\n return {\n ...chain,\n points2: chain.points2.slice(0, -1),\n points3: chain.points3.slice(0, -1),\n };\n};\n\nconst closeChainIfGapSmall = (chain: Chain, epsilon: number): { chain?: Chain; rejected: boolean; short: boolean } => {\n if (!chainIsGeometricallyClosed(chain, epsilon)) return { rejected: false, short: false };\n const closed: Chain = {\n ...chain,\n end: chain.start,\n points2: [...chain.points2.slice(0, -1), chain.points2[0]],\n points3: [...chain.points3.slice(0, -1), chain.points3[0]],\n };\n const normalized = normalizeClosedChain(closed, epsilon);\n if (normalized.points2.length < 3) return { rejected: false, short: true };\n return { chain: normalized, rejected: false, short: false };\n};\n\nconst validClosedChain = (chain: Chain, epsilon: number, options: { allowSelfIntersection?: boolean } = {}) => {\n const normalized = normalizeClosedChain(chain, epsilon);\n if (normalized.points2.length < 3) return false;\n if (Math.abs(signedArea(normalized.points2)) <= AREA_EPSILON) return false;\n if (!options.allowSelfIntersection && chainSelfIntersects(normalized.points2, INTERSECTION_EPSILON)) return false;\n return true;\n};\n\nconst segmentEndpointKeys = (segment: ConnectSegment, epsilon: number): [string, string] => {\n const keys = isIntersectionLine(segment) ? segment.endpointKeys : segment.source?.endpointKeys;\n if (keys) return keys;\n return [`p:${pointKey(segment.points2[0], epsilon)}`, `p:${pointKey(segment.points2[1], epsilon)}`];\n};\n\nconst segmentEndpointRefs = (segment: ConnectSegment) => (isIntersectionLine(segment) ? segment.endpointRefs : segment.source?.endpointRefs);\n\nconst segmentTriangleIndex = (segment: ConnectSegment) => (isIntersectionLine(segment) ? segment.triangleIndex : segment.source?.triangleIndex);\n\nconst endpointAddress = (\n segment: ConnectSegment,\n endpointIndex: 0 | 1,\n endpointKeys: [string, string],\n endpointRefs?: [SectionEndpointReference, SectionEndpointReference],\n): EndpointAddress => {\n const ref = endpointRefs?.[endpointIndex];\n const edgeId =\n isIntersectionLine(segment)\n ? endpointIndex === 0\n ? segment.edgeAId\n : segment.edgeBId\n : ref?.edgeIndex;\n const pointId =\n isIntersectionLine(segment)\n ? endpointIndex === 0\n ? segment.aId\n : segment.bId\n : ref?.vertexIndex;\n\n return {\n edgeId,\n key: endpointKeys[endpointIndex],\n point2: segment.points2[endpointIndex],\n point3: segment.points3[endpointIndex],\n pointId,\n ref,\n };\n};\n\nconst undirectedLineKey = (line: Line) => {\n const startKey = line.start.key;\n const endKey = line.end.key;\n return startKey < endKey ? `${startKey}:${endKey}` : `${endKey}:${startKey}`;\n};\n\nconst prepareLines = (segments: ConnectSegment[], epsilon: number) => {\n const lines: Line[] = [];\n const seen = new Set<string>();\n let duplicateCount = 0;\n let zeroLengthCount = 0;\n\n for (const segment of segments) {\n if (segment.points2.length < 2 || segment.points3.length < 2) continue;\n if (samePoint(segment.points2[0], segment.points2[1], epsilon)) {\n zeroLengthCount += 1;\n continue;\n }\n\n const endpointKeys = segmentEndpointKeys(segment, epsilon);\n const endpointRefs = segmentEndpointRefs(segment);\n const line: Line = {\n end: endpointAddress(segment, 1, endpointKeys, endpointRefs),\n id: lines.length,\n noSeed: isIntersectionLine(segment) ? segment.noSeed ?? false : false,\n skip: isIntersectionLine(segment) ? segment.skip ?? false : false,\n start: endpointAddress(segment, 0, endpointKeys, endpointRefs),\n triangleIndex: segmentTriangleIndex(segment),\n };\n const key = undirectedLineKey(line);\n if (seen.has(key)) {\n duplicateCount += 1;\n continue;\n }\n\n seen.add(key);\n lines.push(line);\n }\n\n return {\n duplicateCount,\n lines,\n zeroLengthCount,\n };\n};\n\nconst addressKeys = (endpoint: EndpointAddress) => {\n const keys: string[] = [];\n if (typeof endpoint.edgeId === \"number\") keys.push(`e:${endpoint.edgeId}`);\n if (typeof endpoint.pointId === \"number\") keys.push(`v:${endpoint.pointId}`);\n keys.push(endpoint.key);\n return [...new Set(keys)];\n};\n\nconst addressMatches = (a: EndpointAddress, b: EndpointAddress) =>\n addressKeys(a).some((key) => addressKeys(b).includes(key));\n\nconst sharedIncidentEdge = (a?: SectionEndpointReference, b?: SectionEndpointReference) => {\n if (!a || !b) return false;\n if (typeof a.edgeIndex === \"number\" && typeof b.edgeIndex === \"number\" && a.edgeIndex === b.edgeIndex) return true;\n\n const aEdges = new Set<number>();\n if (typeof a.edgeIndex === \"number\") aEdges.add(a.edgeIndex);\n for (const edgeIndex of a.incidentEdgeIndices ?? []) aEdges.add(edgeIndex);\n\n if (typeof b.edgeIndex === \"number\" && aEdges.has(b.edgeIndex)) return true;\n return (b.incidentEdgeIndices ?? []).some((edgeIndex) => aEdges.has(edgeIndex));\n};\n\nconst normalizedDot = (aStart: Vec2, aEnd: Vec2, bStart: Vec2, bEnd: Vec2) => {\n const ax = aEnd[0] - aStart[0];\n const ay = aEnd[1] - aStart[1];\n const bx = bEnd[0] - bStart[0];\n const by = bEnd[1] - bStart[1];\n const aLength = Math.sqrt(ax * ax + ay * ay);\n const bLength = Math.sqrt(bx * bx + by * by);\n if (aLength <= Number.EPSILON || bLength <= Number.EPSILON) return 1;\n return (ax * bx + ay * by) / (aLength * bLength);\n};\n\nconst lineEndpoint = (line: Line, endpointIndex: 0 | 1) => (endpointIndex === 0 ? line.start : line.end);\n\nconst otherLineEndpoint = (line: Line, endpointIndex: 0 | 1) => (endpointIndex === 0 ? line.end : line.start);\n\nconst orientedLineFromEndpoint = (line: Line, enterEndpointIndex: 0 | 1): OrientedLine => ({\n enter: lineEndpoint(line, enterEndpointIndex),\n exit: otherLineEndpoint(line, enterEndpointIndex),\n line,\n});\n\nconst buildEndpointIndex = (lines: Line[]) => {\n const byKey = new Map<string, number[]>();\n\n const add = (key: string, lineId: number, endpointIndex: 0 | 1) => {\n const encoded = lineId * 2 + endpointIndex;\n const bucket = byKey.get(key);\n if (bucket) {\n bucket.push(encoded);\n } else {\n byKey.set(key, [encoded]);\n }\n };\n\n for (const line of lines) {\n if (line.skip) continue;\n for (const key of addressKeys(line.start)) add(key, line.id, 0);\n for (const key of addressKeys(line.end)) add(key, line.id, 1);\n }\n\n return byKey;\n};\n\nconst candidateNextLines = (\n lines: Line[],\n endpointIndex: Map<string, number[]>,\n endpoint: EndpointAddress,\n usedLineIds: ReadonlySet<number>,\n): OrientedLine[] => {\n const candidates = new Map<number, OrientedLine>();\n for (const key of addressKeys(endpoint)) {\n for (const encoded of endpointIndex.get(key) ?? []) {\n const lineId = Math.floor(encoded / 2);\n const enterEndpointIndex = (encoded % 2) as 0 | 1;\n if (usedLineIds.has(lineId)) continue;\n candidates.set(encoded, orientedLineFromEndpoint(lines[lineId], enterEndpointIndex));\n }\n }\n return [...candidates.values()];\n};\n\nconst chooseNextLine = (current: OrientedLine, candidates: OrientedLine[]) => {\n if (candidates.length <= 1) return candidates[0];\n\n const scored = candidates\n .map((candidate) => {\n const topologyScore = sharedIncidentEdge(current.exit.ref, candidate.enter.ref) ? 100 : 0;\n const triangleScore = current.line.triangleIndex !== candidate.line.triangleIndex ? 10 : 0;\n const directionScore = normalizedDot(current.enter.point2, current.exit.point2, candidate.enter.point2, candidate.exit.point2);\n const seedPenalty = candidate.line.noSeed ? 0.01 : 0;\n return {\n candidate,\n score: topologyScore + triangleScore + directionScore - seedPenalty,\n };\n })\n .sort((a, b) => b.score - a.score);\n\n const best = scored[0];\n const second = scored[1];\n if (!best) return undefined;\n\n const hasTopologySupport = best.score >= 50;\n const hasClearDirection = best.score >= 10.75 && (!second || best.score - second.score >= 0.05);\n if (!hasTopologySupport && !hasClearDirection) return undefined;\n return best.candidate;\n};\n\nconst traceDirectedChain = (\n lines: Line[],\n endpointIndex: Map<string, number[]>,\n seed: OrientedLine,\n globallyUsedLineIds: ReadonlySet<number>,\n closingEpsilon: number,\n) => {\n const points2: Vec2[] = [seed.enter.point2, seed.exit.point2];\n const points3: Vec3[] = [seed.enter.point3, seed.exit.point3];\n const lineIds = [seed.line.id];\n const localUsedLineIds = new Set([seed.line.id]);\n let current = seed;\n let closed = false;\n let selfTouch = false;\n let ambiguous = false;\n const maxSteps = Math.max(lines.length + 1, 1);\n\n for (let step = 0; step < maxSteps; step += 1) {\n if ((addressMatches(current.exit, seed.enter) || samePoint(current.exit.point2, seed.enter.point2, closingEpsilon)) && lineIds.length > 1) {\n closed = true;\n break;\n }\n\n const candidates = candidateNextLines(lines, endpointIndex, current.exit, globallyUsedLineIds).filter(\n (candidate) => !localUsedLineIds.has(candidate.line.id),\n );\n const closingCandidate =\n addressMatches(current.exit, seed.enter) || samePoint(current.exit.point2, seed.enter.point2, closingEpsilon) ? seed : undefined;\n const allCandidates = closingCandidate ? [...candidates, closingCandidate] : candidates;\n const next = chooseNextLine(current, allCandidates);\n\n if (!next) {\n ambiguous = allCandidates.length > 1;\n break;\n }\n\n if (next.line.id === seed.line.id) {\n closed = true;\n break;\n }\n\n if (localUsedLineIds.has(next.line.id)) {\n selfTouch = true;\n break;\n }\n\n localUsedLineIds.add(next.line.id);\n lineIds.push(next.line.id);\n points2.push(next.exit.point2);\n points3.push(next.exit.point3);\n current = next;\n }\n\n return {\n ambiguous,\n chain: {\n end: current.exit,\n lineIds,\n points2,\n points3,\n start: seed.enter,\n },\n closed,\n selfTouch,\n };\n};\n\nconst reverseChain = (chain: Chain): Chain => ({\n end: chain.start,\n lineIds: [...chain.lineIds].reverse(),\n points2: [...chain.points2].reverse(),\n points3: [...chain.points3].reverse(),\n start: chain.end,\n});\n\nconst mergeChains = (a: Chain, b: Chain): Chain => ({\n end: b.end,\n lineIds: [...a.lineIds, ...b.lineIds],\n points2: [...a.points2, ...b.points2.slice(1)],\n points3: [...a.points3, ...b.points3.slice(1)],\n start: a.start,\n});\n\nconst chainEndDirectionScore = (a: Chain, b: Chain) => {\n if (a.points2.length < 2 || b.points2.length < 2) return 1;\n return normalizedDot(\n a.points2[a.points2.length - 2],\n a.points2[a.points2.length - 1],\n b.points2[0],\n b.points2[1],\n );\n};\n\nconst exactMergeCandidate = (a: Chain, b: Chain): Chain | undefined => {\n if (addressMatches(a.end, b.start)) return mergeChains(a, b);\n if (addressMatches(a.end, b.end)) return mergeChains(a, reverseChain(b));\n if (addressMatches(a.start, b.end)) return mergeChains(b, a);\n if (addressMatches(a.start, b.start)) return mergeChains(reverseChain(a), b);\n return undefined;\n};\n\ntype NearMergeCandidate = {\n chain: Chain;\n distance: number;\n directionScore: number;\n};\n\nconst nearMergeCandidates = (a: Chain, b: Chain, epsilon: number) => {\n const candidates: NearMergeCandidate[] = [];\n const reversedA = reverseChain(a);\n const reversedB = reverseChain(b);\n const minimumDirectionScore = -0.35;\n\n const addIfNear = (left: Chain, right: Chain) => {\n const distance = distance2(left.end.point2, right.start.point2);\n if (distance > epsilon) return;\n const directionScore = chainEndDirectionScore(left, right);\n if (directionScore < minimumDirectionScore) return;\n\n candidates.push(\n {\n chain: mergeChains(left, {\n ...right,\n start: left.end,\n points2: [left.end.point2, ...right.points2.slice(1)],\n points3: [left.end.point3, ...right.points3.slice(1)],\n }),\n directionScore,\n distance,\n },\n );\n };\n\n addIfNear(a, b);\n addIfNear(a, reversedB);\n addIfNear(reversedA, b);\n addIfNear(reversedA, reversedB);\n\n return candidates;\n};\n\nconst nearMergeCandidate = (a: Chain, b: Chain, epsilon: number) => {\n const candidates = nearMergeCandidates(a, b, epsilon).sort((aCandidate, bCandidate) => {\n const distanceDelta = aCandidate.distance - bCandidate.distance;\n if (Math.abs(distanceDelta) > 1e-9) return distanceDelta;\n return bCandidate.directionScore - aCandidate.directionScore;\n });\n return candidates[0];\n};\n\nconst chainOpenPolylines = (openChains: Chain[], closingEpsilon: number) => {\n const remaining = [...openChains];\n const closedChains: Chain[] = [];\n let ambiguousEndpointCount = 0;\n let discardedShortNearClosedChainCount = 0;\n let exactMergedChainCount = 0;\n let gapClosedChainCount = 0;\n let nearMergeAmbiguousCount = 0;\n let nearMergeCandidateCount = 0;\n let nearMergedChainCount = 0;\n let rejectedClosedChainCount = 0;\n let shortNearClosedChainCount = 0;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n let exactMerge:\n | {\n aIndex: number;\n bIndex: number;\n chain: Chain;\n }\n | undefined;\n\n for (let aIndex = 0; aIndex < remaining.length; aIndex += 1) {\n const candidates: { bIndex: number; chain: Chain }[] = [];\n for (let bIndex = aIndex + 1; bIndex < remaining.length; bIndex += 1) {\n const chain = exactMergeCandidate(remaining[aIndex], remaining[bIndex]);\n if (chain) candidates.push({ bIndex, chain });\n }\n\n if (candidates.length === 1) {\n exactMerge = {\n aIndex,\n bIndex: candidates[0].bIndex,\n chain: candidates[0].chain,\n };\n break;\n }\n\n if (candidates.length > 1) ambiguousEndpointCount += candidates.length;\n }\n\n if (exactMerge) {\n remaining.splice(exactMerge.bIndex, 1);\n remaining.splice(exactMerge.aIndex, 1, exactMerge.chain);\n exactMergedChainCount += 1;\n changed = true;\n continue;\n }\n\n let merge:\n | {\n aIndex: number;\n bIndex: number;\n chain: Chain;\n }\n | undefined;\n\n for (let aIndex = 0; aIndex < remaining.length; aIndex += 1) {\n const candidates: { bIndex: number; candidate: NearMergeCandidate }[] = [];\n for (let bIndex = aIndex + 1; bIndex < remaining.length; bIndex += 1) {\n const candidate = nearMergeCandidate(remaining[aIndex], remaining[bIndex], closingEpsilon);\n if (!candidate) continue;\n nearMergeCandidateCount += 1;\n candidates.push({ bIndex, candidate });\n }\n\n if (candidates.length > 0) {\n candidates.sort((aCandidate, bCandidate) => {\n const distanceDelta = aCandidate.candidate.distance - bCandidate.candidate.distance;\n if (Math.abs(distanceDelta) > 1e-9) return distanceDelta;\n return bCandidate.candidate.directionScore - aCandidate.candidate.directionScore;\n });\n const best = candidates[0];\n const second = candidates[1];\n const clearlyNearest =\n !second ||\n best.candidate.distance <= closingEpsilon * 0.25 ||\n second.candidate.distance - best.candidate.distance >= Math.max(1e-6, closingEpsilon * 0.1);\n\n if (!clearlyNearest) {\n nearMergeAmbiguousCount += candidates.length;\n continue;\n }\n\n merge = {\n aIndex,\n bIndex: best.bIndex,\n chain: best.candidate.chain,\n };\n break;\n }\n }\n\n if (!merge) continue;\n\n remaining.splice(merge.bIndex, 1);\n remaining.splice(merge.aIndex, 1, merge.chain);\n nearMergedChainCount += 1;\n changed = true;\n continue;\n }\n\n for (let index = remaining.length - 1; index >= 0; index -= 1) {\n const chain = remaining[index];\n const closed = closeChainIfGapSmall(chain, closingEpsilon);\n if (closed.short) {\n shortNearClosedChainCount += 1;\n discardedShortNearClosedChainCount += 1;\n remaining.splice(index, 1);\n continue;\n }\n if (closed.rejected) rejectedClosedChainCount += 1;\n if (closed.chain || (addressMatches(chain.start, chain.end) && validClosedChain(chain, closingEpsilon))) {\n closedChains.push(closed.chain ?? normalizeClosedChain(chain, closingEpsilon));\n remaining.splice(index, 1);\n gapClosedChainCount += closed.chain ? 1 : 0;\n }\n }\n\n return {\n ambiguousEndpointCount,\n closedChains,\n discardedShortNearClosedChainCount,\n exactMergedChainCount,\n gapClosedChainCount,\n nearMergeAmbiguousCount,\n nearMergeCandidateCount,\n nearMergedChainCount,\n openChains: remaining,\n rejectedClosedChainCount,\n shortNearClosedChainCount,\n };\n};\n\nconst chainGap = (chain: Chain) => distance2(chain.points2[0], chain.points2[chain.points2.length - 1]);\n\nconst openGapRange = (chains: Chain[]) => {\n if (chains.length === 0) return { max: 0, min: 0 };\n const gaps = chains.map(chainGap);\n return {\n max: Math.max(...gaps),\n min: Math.min(...gaps),\n };\n};\n\nconst makeLoops = (segments: ConnectSegment[], epsilon: number, closingEpsilon: number): MakeLoopsResult => {\n const prepared = prepareLines(segments, epsilon);\n const lines = prepared.lines;\n const endpointIndex = buildEndpointIndex(lines);\n const usedLineIds = new Set<number>();\n const closedChains: Chain[] = [];\n const openChains: Chain[] = [];\n let ambiguousEndpointCount = 0;\n let discardedShortNearClosedChainCount = 0;\n let shortNearClosedChainCount = 0;\n let selfTouchCount = 0;\n\n const seedLines = [\n ...lines.filter((line) => !line.skip && !line.noSeed),\n ...lines.filter((line) => !line.skip && line.noSeed),\n ];\n\n for (const line of seedLines) {\n if (usedLineIds.has(line.id)) continue;\n\n const forward = traceDirectedChain(lines, endpointIndex, orientedLineFromEndpoint(line, 0), usedLineIds, closingEpsilon);\n const reverse = traceDirectedChain(lines, endpointIndex, orientedLineFromEndpoint(line, 1), usedLineIds, closingEpsilon);\n const traced =\n [forward, reverse].find((candidate) => candidate.closed && !candidate.selfTouch && validClosedChain(candidate.chain, closingEpsilon)) ??\n [forward, reverse]\n .filter((candidate) => !candidate.selfTouch)\n .sort((a, b) => b.chain.lineIds.length - a.chain.lineIds.length)[0] ??\n forward;\n for (const lineId of traced.chain.lineIds) usedLineIds.add(lineId);\n\n if (traced.ambiguous) ambiguousEndpointCount += 1;\n if (traced.selfTouch) selfTouchCount += 1;\n\n const gapClosed = closeChainIfGapSmall(traced.chain, closingEpsilon);\n if (gapClosed.short) shortNearClosedChainCount += 1;\n if (gapClosed.rejected) ambiguousEndpointCount += 1;\n if (!traced.selfTouch && (gapClosed.chain || (traced.closed && validClosedChain(traced.chain, closingEpsilon)))) {\n closedChains.push(gapClosed.chain ?? normalizeClosedChain(traced.chain, closingEpsilon));\n } else if (traced.chain.points2.length >= 2) {\n openChains.push(traced.chain);\n }\n }\n\n const chained = chainOpenPolylines(openChains, closingEpsilon);\n const gapRange = openGapRange(chained.openChains);\n\n return {\n ambiguousEndpointCount: ambiguousEndpointCount + chained.ambiguousEndpointCount,\n closedChains: [...closedChains, ...chained.closedChains],\n discardedShortNearClosedChainCount: discardedShortNearClosedChainCount + chained.discardedShortNearClosedChainCount,\n duplicateCount: prepared.duplicateCount,\n exactMergedChainCount: chained.exactMergedChainCount,\n gapClosedChainCount: chained.gapClosedChainCount,\n nearMergeAmbiguousCount: chained.nearMergeAmbiguousCount,\n nearMergeCandidateCount: chained.nearMergeCandidateCount,\n nearMergedChainCount: chained.nearMergedChainCount,\n openGapMax: gapRange.max,\n openGapMin: gapRange.min,\n openChains: chained.openChains,\n pairedLineCount: usedLineIds.size,\n rejectedClosedChainCount: chained.rejectedClosedChainCount,\n selfTouchCount,\n shortNearClosedChainCount: shortNearClosedChainCount + chained.shortNearClosedChainCount,\n zeroLengthCount: prepared.zeroLengthCount,\n };\n};\n\nexport const connectSectionSegments = (section: Section, options: SliceOptions = {}): Section => {\n const sourceSegments = section.intersectionLines && section.intersectionLines.length > 0 ? section.intersectionLines : section.openCurves;\n const inputSegments = sourceSegments.filter((segment) => segment.points2.length >= 2 && segment.points3.length >= 2);\n const closingEpsilon = Math.max(BASE_CONNECT_EPSILON, options.closingRadius ?? DEFAULT_SLICE_CLOSING_RADIUS);\n const result = makeLoops(inputSegments, BASE_CONNECT_EPSILON, closingEpsilon);\n const shouldEmitOpenCurves = options.emitOpenCurves ?? options.diagnostics !== \"none\";\n\n const curves: SectionCurve[] = result.closedChains.map((chain, index) => {\n const area = signedArea(chain.points2);\n return {\n area,\n closed: true,\n id: `curve-${index}`,\n points2: chain.points2,\n points3: chain.points3,\n role: \"unknown\",\n winding: area >= 0 ? \"ccw\" : \"cw\",\n };\n });\n\n const openCurves: SectionCurve[] = shouldEmitOpenCurves\n ? result.openChains.map((chain, index) => ({\n closed: false,\n id: `open-${index}`,\n points2: chain.points2,\n points3: chain.points3,\n role: \"open\",\n }))\n : [];\n\n const classifiedCurves = classifySectionCurves(section, curves);\n const outerCount = classifiedCurves.filter((curve) => curve.role === \"outer\").length;\n const holeCount = classifiedCurves.filter((curve) => curve.role === \"hole\").length;\n const islandCount = classifiedCurves.filter((curve) => curve.role === \"island\").length;\n const invalidCount = classifiedCurves.filter((curve) => curve.role === \"invalid\").length;\n const diagnostics =\n options.diagnostics === \"none\"\n ? []\n : [\n ...section.diagnostics,\n ...(result.zeroLengthCount > 0 || result.duplicateCount > 0\n ? [\n {\n level: \"info\" as const,\n message: `${result.zeroLengthCount} zero-length section segments and ${result.duplicateCount} duplicate section segments were removed before make_loops.`,\n },\n ]\n : []),\n ...(result.ambiguousEndpointCount > 0 || result.selfTouchCount > 0\n ? [\n {\n level: result.ambiguousEndpointCount > 0 ? (\"warning\" as const) : (\"info\" as const),\n message: `${result.ambiguousEndpointCount} section endpoints remained ambiguous and ${result.selfTouchCount} self-touching loop candidates were left open by make_loops.`,\n },\n ]\n : []),\n {\n level: \"info\" as const,\n message: `${result.pairedLineCount} section lines were consumed by make_loops.`,\n },\n ...(result.openChains.length > 0\n ? [\n {\n level: \"info\" as const,\n message: `make_loops repair: ${result.gapClosedChainCount} gap-closed, ${result.exactMergedChainCount} exact-merged, ${result.nearMergedChainCount}/${result.nearMergeCandidateCount} near-merged, ${result.nearMergeAmbiguousCount} near candidates ambiguous, ${result.shortNearClosedChainCount} short near-closed chains, ${result.rejectedClosedChainCount} closed candidates rejected; open gap range ${result.openGapMin.toFixed(6)}-${result.openGapMax.toFixed(6)} mm with closing ${closingEpsilon.toFixed(6)} mm.`,\n },\n ]\n : []),\n ...(result.discardedShortNearClosedChainCount > 0\n ? [\n {\n level: \"info\" as const,\n message: `${result.discardedShortNearClosedChainCount} short near-closed non-contour fragments were discarded after make_loops.`,\n },\n ]\n : []),\n {\n level: classifiedCurves.length > 0 && invalidCount === 0 ? (\"info\" as const) : (\"warning\" as const),\n message: `${outerCount} outer curves, ${holeCount} hole curves, ${islandCount} island curves, ${invalidCount} invalid curves, and ${openCurves.length} open curves connected from ${inputSegments.length} section segments.`,\n },\n ];\n\n const { intersectionLines: _intersectionLines, rawCurves: _rawCurves, openCurves: _sourceOpenCurves, ...sectionBase } = section;\n\n return {\n ...sectionBase,\n curves: classifiedCurves,\n diagnostics,\n openCurves,\n };\n};\n", "import { cross3, dot3, normalize3 } from \"../geometry/vector\";\nimport type { Frame3, Vec3 } from \"../geometry/types\";\nimport type { PlaneSectionSpec } from \"./types\";\n\ntype PitchFunction = (distance: number, index: number) => number;\ntype PlaneStackPitch = number | PitchFunction;\n\ntype PlaneStackOptions = {\n includeMax?: boolean;\n includeMin?: boolean;\n max: number;\n min: number;\n pitch: PlaneStackPitch;\n};\n\ntype OrientedPlaneStackOptions = PlaneStackOptions & {\n normal: Vec3;\n origin: Vec3;\n xAxis?: Vec3;\n};\n\ntype PointNormalOptions = {\n xAxis?: Vec3;\n};\n\nexport type RailPlaneOptions = PlaneStackOptions & {\n normalAt: (distance: number, index: number) => Vec3;\n pointAt: (distance: number, index: number) => Vec3;\n xAxis?: Vec3;\n xAxisAt?: (distance: number, index: number) => Vec3;\n};\n\nconst DISTANCE_EPSILON = 1e-9;\n\nconst fallbackXAxis = (normal: Vec3): Vec3 => {\n const nearZ = Math.abs(dot3(normal, [0, 0, 1])) > 0.95;\n return nearZ ? [1, 0, 0] : normalize3(cross3([0, 0, 1], normal));\n};\n\nconst finiteDistance = (value: number, label: string) => {\n if (!Number.isFinite(value)) {\n throw new Error(`Plane stack ${label} must be a finite number.`);\n }\n\n return value;\n};\n\nconst pitchAt = (pitch: PlaneStackPitch, distance: number, index: number) => {\n const value = typeof pitch === \"function\" ? pitch(distance, index) : pitch;\n\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(\"Plane stack pitch must return a positive finite number.\");\n }\n\n return value;\n};\n\nconst stackDistances = ({ includeMax = false, includeMin = false, max, min, pitch }: PlaneStackOptions) => {\n const start = finiteDistance(min, \"min\");\n const end = finiteDistance(max, \"max\");\n if (end < start) return [];\n\n const distances: number[] = [];\n let index = 0;\n let distance = start;\n\n if (includeMin) {\n distances.push(start);\n }\n\n while (distance < end - DISTANCE_EPSILON) {\n distance += pitchAt(pitch, distance, index);\n if (distance > end + DISTANCE_EPSILON) break;\n distances.push(distance);\n index += 1;\n }\n\n if (includeMax) {\n const last = distances[distances.length - 1];\n if (last === undefined || Math.abs(last - end) > DISTANCE_EPSILON) {\n distances.push(end);\n }\n }\n\n return distances;\n};\n\nconst pointAlongNormal = (origin: Vec3, normal: Vec3, distance: number): Vec3 => [\n origin[0] + normal[0] * distance,\n origin[1] + normal[1] * distance,\n origin[2] + normal[2] * distance,\n];\n\nconst planeFromRail = ({ normalAt, pointAt, xAxis, xAxisAt }: RailPlaneOptions, distance: number, index: number): PlaneSectionSpec => ({\n distance,\n kind: \"plane\",\n origin: pointAt(distance, index),\n normal: normalAt(distance, index),\n xAxis: xAxisAt?.(distance, index) ?? xAxis,\n});\n\nexport const railPlanes = (options: RailPlaneOptions): PlaneSectionSpec[] =>\n stackDistances(options).map((distance, index) => planeFromRail(options, distance, index));\n\nexport const Plane = {\n z: (z: number): PlaneSectionSpec => ({\n distance: z,\n kind: \"plane\",\n origin: [0, 0, z],\n normal: [0, 0, 1],\n xAxis: [1, 0, 0],\n }),\n\n fromPointNormal: (origin: Vec3, normal: Vec3, options: PointNormalOptions = {}): PlaneSectionSpec => ({\n kind: \"plane\",\n distance: 0,\n origin,\n normal,\n xAxis: options.xAxis,\n }),\n\n fromNormal: ({ origin, normal, xAxis }: { origin: Vec3; normal: Vec3; xAxis?: Vec3 }) => ({\n kind: \"plane\" as const,\n distance: 0,\n origin,\n normal,\n xAxis,\n }),\n\n stack: ({ origin, normal, xAxis, ...options }: OrientedPlaneStackOptions): PlaneSectionSpec[] => {\n const unitNormal = normalize3(normal);\n const direction = dot3(unitNormal, unitNormal) > 0 ? unitNormal : [0, 0, 1] satisfies Vec3;\n\n return stackDistances(options).map((distance) => ({\n kind: \"plane\" as const,\n distance,\n origin: pointAlongNormal(origin, direction, distance),\n normal: direction,\n xAxis,\n }));\n },\n\n zStack: (options: PlaneStackOptions): PlaneSectionSpec[] =>\n stackDistances(options).map((z) => ({\n kind: \"plane\" as const,\n distance: z,\n origin: [0, 0, z],\n normal: [0, 0, 1],\n xAxis: [1, 0, 0],\n })),\n\n rail: railPlanes,\n};\n\nexport const frameFromPlane = (plane: PlaneSectionSpec): Frame3 => {\n const normal = normalize3(plane.normal);\n const xAxis = normalize3(plane.xAxis ?? fallbackXAxis(normal));\n const yAxis = normalize3(cross3(normal, xAxis));\n\n return {\n origin: plane.origin,\n normal,\n xAxis,\n yAxis,\n };\n};\n", "import type { Vec2 } from \"../geometry/types\";\nimport { pointInPolygon2 } from \"../geometry/kernel/classify\";\nimport { offsetRegionRings2, type OffsetOptions } from \"../geometry/kernel/offset\";\nimport { classifySectionCurves } from \"./classify\";\nimport type { Section, SectionCurve } from \"./types\";\n\nexport type SectionRegion = {\n contains: (point: Vec2) => boolean;\n inset: (distance: number) => SectionRegion;\n section: Section;\n subtract: (other: SectionRegion) => SectionRegion;\n};\n\nexport const pointInPolygon = (point: Vec2, polygon: Vec2[]) => pointInPolygon2(point, polygon);\n\nexport const distanceToSegment = (point: Vec2, start: Vec2, end: Vec2) => {\n const dx = end[0] - start[0];\n const dy = end[1] - start[1];\n const lengthSquared = dx * dx + dy * dy;\n const t =\n lengthSquared === 0\n ? 0\n : Math.max(0, Math.min(1, ((point[0] - start[0]) * dx + (point[1] - start[1]) * dy) / lengthSquared));\n const closestX = start[0] + dx * t;\n const closestY = start[1] + dy * t;\n const px = point[0] - closestX;\n const py = point[1] - closestY;\n\n return Math.sqrt(px * px + py * py);\n};\n\nexport const distanceToSectionBoundary = (point: Vec2, section: Section) => {\n let distance = Infinity;\n\n for (const curve of section.curves) {\n if (curve.role === \"invalid\" || curve.points2.length < 2) continue;\n\n for (let index = 0; index < curve.points2.length; index += 1) {\n const start = curve.points2[index];\n const end = curve.points2[(index + 1) % curve.points2.length];\n distance = Math.min(distance, distanceToSegment(point, start, end));\n }\n }\n\n return distance;\n};\n\nexport const pointInSection = (point: Vec2, section: Section, margin = 0) => {\n const containingCount = section.curves.filter(\n (curve) => curve.role !== \"invalid\" && curve.points2.length >= 3 && pointInPolygon(point, curve.points2),\n ).length;\n const inside = containingCount % 2 === 1;\n\n return inside && (margin <= 0 || distanceToSectionBoundary(point, section) >= margin);\n};\n\nexport const offsetSectionRegion = (section: Section, distance: number, options: OffsetOptions = {}): Section => {\n const diagnostics: Section[\"diagnostics\"] = [];\n const offset = offsetRegionRings2(\n section.curves.map((curve) => ({\n points: curve.points2,\n role: curve.role,\n })),\n distance,\n options,\n );\n\n for (const warning of offset.warnings) {\n diagnostics.push({\n level: \"info\",\n message: `Offset region: ${warning}.`,\n });\n }\n\n if (offset.ok === false) {\n diagnostics.push({\n level: \"warning\",\n message: `Offset region discarded: ${offset.reason}.`,\n });\n }\n\n const offsetRings = offset.ok ? offset.rings : [];\n const offsetCurves = offsetRings.map((ring, index): SectionCurve => {\n const sourceCurve = section.curves.find((curve) => pointInPolygon(ring[0], curve.points2));\n return {\n id: `offset-region-${index}`,\n points2: ring,\n points3: [],\n closed: true,\n role: sourceCurve?.role ?? \"unknown\",\n };\n });\n const classifiedCurves = classifySectionCurves(section, offsetCurves);\n\n return {\n ...section,\n curves: classifiedCurves,\n diagnostics: [\n ...section.diagnostics,\n ...diagnostics,\n {\n level: classifiedCurves.length > 0 ? \"info\" : \"warning\",\n message: `Inset region by ${distance.toFixed(3)} mm: ${classifiedCurves.length} region curves remain from ${section.curves.length} source curves.`,\n },\n ],\n };\n};\n\nexport const createSectionRegion = (section: Section, contains?: (point: Vec2) => boolean) => {\n const containsPoint = contains ?? ((point: Vec2) => pointInSection(point, section));\n const isBaseRegion = !contains;\n\n const region: SectionRegion = {\n contains: containsPoint,\n inset: (distance) => {\n if (distance <= 0) return createSectionRegion(section, contains);\n if (isBaseRegion) {\n const insetSection = offsetSectionRegion(section, distance);\n const sourceRegionCount = section.curves.filter((curve) => curve.role !== \"invalid\" && curve.points2.length >= 3).length;\n const insetRegionCount = insetSection.curves.filter((curve) => curve.role !== \"invalid\" && curve.points2.length >= 3).length;\n\n if (insetRegionCount > 0 || sourceRegionCount === 0) {\n return createSectionRegion(insetSection);\n }\n\n return createSectionRegion(\n {\n ...section,\n diagnostics: [\n ...insetSection.diagnostics,\n {\n level: \"warning\",\n message: `Inset region fallback used source contours because ${insetRegionCount}/${sourceRegionCount} offset curves remained.`,\n },\n ],\n },\n (point) => containsPoint(point) && distanceToSectionBoundary(point, section) >= distance,\n );\n }\n\n return createSectionRegion(\n section,\n (point) => containsPoint(point) && distanceToSectionBoundary(point, section) >= distance,\n );\n },\n section,\n subtract: (other) => createSectionRegion(section, (point) => containsPoint(point) && !other.contains(point)),\n };\n\n return region;\n};\n", "import { cross3, dot3, length3, sub3 } from \"../geometry/vector\";\nimport type { Vec3 } from \"../geometry/types\";\nimport type { Mesh } from \"./types\";\n\nexport type MeshEdgeKind = \"boundary\" | \"manifold\" | \"non-manifold\";\n\nexport type MeshTopologyTriangle = {\n duplicate: boolean;\n edgeIds: [number, number, number];\n skipReason?: \"degenerate\" | \"duplicate\";\n sourceIndex: number;\n vertexIds: [number, number, number];\n};\n\nexport type MeshTopologyEdge = {\n id: number;\n key: string;\n kind: MeshEdgeKind;\n triangleIds: number[];\n vertexIds: [number, number];\n};\n\nexport type MeshTopologyDiagnostics = {\n boundaryEdgeCount: number;\n degenerateTriangleCount: number;\n duplicateTriangleCount: number;\n manifoldEdgeCount: number;\n nonManifoldEdgeCount: number;\n originalTriangleCount: number;\n sharedVertexCount: number;\n};\n\nexport type MeshTopology = {\n diagnostics: MeshTopologyDiagnostics;\n edges: MeshTopologyEdge[];\n triangles: MeshTopologyTriangle[];\n vertexEdgeIds: number[][];\n vertexTriangleIds: number[][];\n vertices: Vec3[];\n};\n\nconst topologyCache = new WeakMap<Mesh, Map<string, MeshTopology>>();\nconst planeCandidateCache = new WeakMap<MeshTopology, Map<string, number[]>>();\n\nconst pointGrid3 = (point: Vec3, epsilon: number) =>\n [Math.round(point[0] / epsilon), Math.round(point[1] / epsilon), Math.round(point[2] / epsilon)] as const;\n\nconst pointKey3 = (x: number, y: number, z: number) => `${x},${y},${z}`;\n\nconst distanceSquared3 = (a: Vec3, b: Vec3) => {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const dz = b[2] - a[2];\n return dx * dx + dy * dy + dz * dz;\n};\n\nconst triangleArea = (a: Vec3, b: Vec3, c: Vec3) => length3(cross3(sub3(b, a), sub3(c, a))) / 2;\n\nconst sortedTriangleKey = (ids: readonly [number, number, number]) => [...ids].sort((a, b) => a - b).join(\":\");\n\nconst edgeKeyFromVertexIds = (a: number, b: number) => (a < b ? `${a}:${b}` : `${b}:${a}`);\n\nconst edgeVertexIds = (a: number, b: number): [number, number] => (a < b ? [a, b] : [b, a]);\n\nexport const buildMeshTopology = (mesh: Mesh, epsilon: number): MeshTopology => {\n const vertices: Vec3[] = [];\n const vertexBuckets = new Map<string, number[]>();\n const epsilonSquared = epsilon * epsilon;\n const edgeByKey = new Map<string, number>();\n const edges: MeshTopologyEdge[] = [];\n const triangleKeys = new Set<string>();\n let degenerateTriangleCount = 0;\n let duplicateTriangleCount = 0;\n\n const addVertex = (point: Vec3) => {\n const [gridX, gridY, gridZ] = pointGrid3(point, epsilon);\n\n for (let dx = -1; dx <= 1; dx += 1) {\n for (let dy = -1; dy <= 1; dy += 1) {\n for (let dz = -1; dz <= 1; dz += 1) {\n const bucket = vertexBuckets.get(pointKey3(gridX + dx, gridY + dy, gridZ + dz));\n if (!bucket) continue;\n\n for (const vertexId of bucket) {\n if (distanceSquared3(vertices[vertexId], point) <= epsilonSquared) return vertexId;\n }\n }\n }\n }\n\n const id = vertices.length;\n vertices.push(point);\n const key = pointKey3(gridX, gridY, gridZ);\n const bucket = vertexBuckets.get(key);\n if (bucket) {\n bucket.push(id);\n } else {\n vertexBuckets.set(key, [id]);\n }\n return id;\n };\n\n const addEdge = (a: number, b: number, triangleIndex: number) => {\n const key = edgeKeyFromVertexIds(a, b);\n const existing = edgeByKey.get(key);\n if (typeof existing === \"number\") {\n edges[existing].triangleIds.push(triangleIndex);\n return existing;\n }\n\n const id = edges.length;\n edges.push({\n id,\n key,\n kind: \"boundary\",\n triangleIds: [triangleIndex],\n vertexIds: edgeVertexIds(a, b),\n });\n edgeByKey.set(key, id);\n return id;\n };\n\n const triangles = mesh.triangles.map((triangle, sourceIndex): MeshTopologyTriangle => {\n const vertexIds = [addVertex(triangle.a), addVertex(triangle.b), addVertex(triangle.c)] as [number, number, number];\n const duplicate = triangleKeys.has(sortedTriangleKey(vertexIds));\n const degenerate =\n vertexIds[0] === vertexIds[1] ||\n vertexIds[1] === vertexIds[2] ||\n vertexIds[2] === vertexIds[0] ||\n triangleArea(triangle.a, triangle.b, triangle.c) <= epsilon * epsilon;\n\n if (duplicate) {\n duplicateTriangleCount += 1;\n } else {\n triangleKeys.add(sortedTriangleKey(vertexIds));\n }\n\n if (degenerate) {\n degenerateTriangleCount += 1;\n }\n\n const skipReason = degenerate ? \"degenerate\" : duplicate ? \"duplicate\" : undefined;\n const edgeIds = skipReason\n ? ([-1, -1, -1] as [number, number, number])\n : ([\n addEdge(vertexIds[0], vertexIds[1], sourceIndex),\n addEdge(vertexIds[1], vertexIds[2], sourceIndex),\n addEdge(vertexIds[2], vertexIds[0], sourceIndex),\n ] as [number, number, number]);\n\n return {\n duplicate,\n edgeIds,\n skipReason,\n sourceIndex,\n vertexIds,\n };\n });\n\n let boundaryEdgeCount = 0;\n let manifoldEdgeCount = 0;\n let nonManifoldEdgeCount = 0;\n\n for (const edge of edges) {\n if (edge.triangleIds.length === 1) {\n edge.kind = \"boundary\";\n boundaryEdgeCount += 1;\n } else if (edge.triangleIds.length === 2) {\n edge.kind = \"manifold\";\n manifoldEdgeCount += 1;\n } else {\n edge.kind = \"non-manifold\";\n nonManifoldEdgeCount += 1;\n }\n }\n\n const vertexTriangleIds = Array.from({ length: vertices.length }, () => [] as number[]);\n const vertexEdgeIds = Array.from({ length: vertices.length }, () => [] as number[]);\n\n for (const triangle of triangles) {\n if (triangle.skipReason) continue;\n for (const vertexId of triangle.vertexIds) {\n vertexTriangleIds[vertexId].push(triangle.sourceIndex);\n }\n for (const edgeId of triangle.edgeIds) {\n const edge = edges[edgeId];\n for (const vertexId of edge.vertexIds) {\n const edgeIds = vertexEdgeIds[vertexId];\n if (!edgeIds.includes(edgeId)) edgeIds.push(edgeId);\n }\n }\n }\n\n return {\n diagnostics: {\n boundaryEdgeCount,\n degenerateTriangleCount,\n duplicateTriangleCount,\n manifoldEdgeCount,\n nonManifoldEdgeCount,\n originalTriangleCount: mesh.triangles.length,\n sharedVertexCount: vertices.length,\n },\n edges,\n triangles,\n vertexEdgeIds,\n vertexTriangleIds,\n vertices,\n };\n};\n\nexport const getMeshTopology = (mesh: Mesh, epsilon: number) => {\n const key = epsilon.toPrecision(12);\n const existingByEpsilon = topologyCache.get(mesh);\n const cached = existingByEpsilon?.get(key);\n if (cached) return cached;\n\n const topology = buildMeshTopology(mesh, epsilon);\n if (existingByEpsilon) {\n existingByEpsilon.set(key, topology);\n } else {\n topologyCache.set(mesh, new Map([[key, topology]]));\n }\n return topology;\n};\n\nexport const getTriangleIndicesForPlane = (topology: MeshTopology, origin: Vec3, normal: Vec3, epsilon: number) => {\n const key = `${origin.map((value) => value.toPrecision(12)).join(\",\")}:${normal.map((value) => value.toPrecision(12)).join(\",\")}:${epsilon.toPrecision(12)}`;\n const existing = planeCandidateCache.get(topology);\n const cached = existing?.get(key);\n if (cached) return cached;\n\n const indices: number[] = [];\n\n for (const triangle of topology.triangles) {\n if (triangle.skipReason) continue;\n\n const distances = triangle.vertexIds.map((vertexId) => dot3(sub3(topology.vertices[vertexId], origin), normal));\n const minDistance = Math.min(...distances);\n const maxDistance = Math.max(...distances);\n if (minDistance <= epsilon && maxDistance >= -epsilon) {\n indices.push(triangle.sourceIndex);\n }\n }\n\n if (existing) {\n existing.set(key, indices);\n } else {\n planeCandidateCache.set(topology, new Map([[key, indices]]));\n }\n return indices;\n};\n\nconst lowerBound = (values: readonly number[], target: number) => {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (values[mid] < target) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n};\n\nconst upperBound = (values: readonly number[], target: number) => {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (values[mid] <= target) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n};\n\nexport const getTriangleIndicesForParallelPlanes = (\n topology: MeshTopology,\n normal: Vec3,\n planeOffsets: readonly number[],\n epsilon: number,\n) => {\n const sortedOffsets = planeOffsets\n .map((offset, index) => ({ index, offset }))\n .sort((a, b) => a.offset - b.offset);\n const offsets = sortedOffsets.map((entry) => entry.offset);\n const result = Array.from({ length: planeOffsets.length }, () => [] as number[]);\n\n if (offsets.length === 0) return result;\n\n for (const triangle of topology.triangles) {\n if (triangle.skipReason) continue;\n\n const distances = triangle.vertexIds.map((vertexId) => dot3(topology.vertices[vertexId], normal));\n const minDistance = Math.min(...distances);\n const maxDistance = Math.max(...distances);\n const start = lowerBound(offsets, minDistance - epsilon);\n const end = upperBound(offsets, maxDistance + epsilon);\n\n for (let sortedIndex = start; sortedIndex < end; sortedIndex += 1) {\n result[sortedOffsets[sortedIndex].index].push(triangle.sourceIndex);\n }\n }\n\n return result;\n};\n", "import { cross3, dot3, sub3 } from \"../geometry/vector\";\nimport type { Bounds2, Frame3, Vec2, Vec3 } from \"../geometry/types\";\nimport type { Mesh, MeshTriangle } from \"../mesh/types\";\nimport {\n getMeshTopology,\n getTriangleIndicesForParallelPlanes,\n getTriangleIndicesForPlane,\n type MeshTopology,\n type MeshTopologyTriangle,\n} from \"../mesh/topology\";\nimport { frameFromPlane } from \"./plane\";\nimport { DEFAULT_SLICE_CLOSING_RADIUS } from \"./defaults\";\nimport type {\n PlaneSectionSpec,\n Section,\n SectionCurve,\n SectionEndpointReference,\n SectionIntersectionLine,\n SectionSpec,\n SliceOptions,\n} from \"./types\";\n\nconst DEFAULT_INTERSECTION_EPSILON = 1e-6;\nconst DEFAULT_TOPOLOGY_EPSILON = 1e-5;\nconst SNAP_EPSILON = 1e-9;\n\ntype SegmentPoint = {\n edgeId?: number;\n incidentEdgeIds?: [number, number];\n key: string;\n localVertexIndex?: number;\n point: Vec3;\n refKind: \"edge\" | \"vertex\";\n vertexId?: number;\n};\n\ntype SegmentKind = NonNullable<SectionCurve[\"source\"]>[\"kind\"];\n\ntype CanonicalPoint = {\n point2: Vec2;\n point3: Vec3;\n};\n\ntype TriangleIntersection = {\n kind: SegmentKind;\n points: [SegmentPoint, SegmentPoint];\n};\n\ntype EdgeIntersectionPoint = SegmentPoint & {\n side: number;\n};\n\ntype SectionEvaluator<TSpec extends SectionSpec> = {\n intersect: (spec: TSpec) => Section;\n intersectStack: (specs: readonly TSpec[]) => Section[];\n kind: TSpec[\"kind\"];\n};\n\nconst lerp3 = (a: Vec3, b: Vec3, t: number): Vec3 => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n];\n\nconst emptyBounds2 = (): Bounds2 => ({\n min: [Infinity, Infinity],\n max: [-Infinity, -Infinity],\n});\n\nconst includePoint2 = (bounds: Bounds2, point: Vec2): Bounds2 => ({\n min: [Math.min(bounds.min[0], point[0]), Math.min(bounds.min[1], point[1])],\n max: [Math.max(bounds.max[0], point[0]), Math.max(bounds.max[1], point[1])],\n});\n\nconst projectPoint = (point: Vec3, frame: Frame3): Vec2 => {\n const local = sub3(point, frame.origin);\n return [dot3(local, frame.xAxis), dot3(local, frame.yAxis)];\n};\n\nconst samePoint3 = (a: Vec3, b: Vec3, epsilon: number) =>\n Math.abs(a[0] - b[0]) < epsilon && Math.abs(a[1] - b[1]) < epsilon && Math.abs(a[2] - b[2]) < epsilon;\n\nconst uniqueSegmentPoints = <TPoint extends SegmentPoint>(points: TPoint[]) =>\n points.filter((point, index) => points.findIndex((other) => other.key === point.key) === index);\n\nconst orientedSegmentPoints = (\n triangle: MeshTriangle,\n normal: Vec3,\n points: [SegmentPoint, SegmentPoint],\n): [SegmentPoint, SegmentPoint] => {\n const triangleNormal = cross3(sub3(triangle.b, triangle.a), sub3(triangle.c, triangle.a));\n const targetDirection = cross3(normal, triangleNormal);\n const segmentDirection = sub3(points[1].point, points[0].point);\n return dot3(segmentDirection, targetDirection) < 0 ? [points[1], points[0]] : points;\n};\n\nconst endpointReference = (point: SegmentPoint): SectionEndpointReference => ({\n edgeIndex: point.edgeId,\n incidentEdgeIndices: point.incidentEdgeIds,\n key: point.key,\n kind: point.refKind,\n localVertexIndex: point.localVertexIndex,\n vertexIndex: point.vertexId,\n});\n\nconst pointAddress = (point: SegmentPoint, kind: SegmentKind) => {\n if (kind === \"cross\" && point.refKind === \"edge\" && typeof point.edgeId === \"number\") {\n return {\n edgeId: point.edgeId,\n pointId: point.vertexId,\n };\n }\n\n return {\n edgeId: undefined,\n pointId: point.vertexId,\n };\n};\n\nconst sideOfDistance = (distance: number, epsilon: number) => (distance > epsilon ? 1 : distance < -epsilon ? -1 : 0);\n\nconst sameNormal = (a: Vec3, b: Vec3, epsilon = 1e-9) =>\n Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon && Math.abs(a[2] - b[2]) <= epsilon;\n\nconst localEdgeVertexIndices = [\n [0, 1],\n [1, 2],\n [2, 0],\n] as const;\n\nconst incidentLocalEdgeIndicesForVertex = (localVertexIndex: number): [number, number] => {\n if (localVertexIndex === 0) return [0, 2];\n if (localVertexIndex === 1) return [0, 1];\n return [1, 2];\n};\n\nconst vertexPoint = (\n topology: MeshTopology,\n topologyTriangle: MeshTopologyTriangle,\n localVertexIndex: number,\n edgeId?: number,\n): SegmentPoint => ({\n edgeId,\n incidentEdgeIds: incidentLocalEdgeIndicesForVertex(localVertexIndex).map(\n (localEdgeIndex) => topologyTriangle.edgeIds[localEdgeIndex],\n ) as [number, number],\n key: `v:${topologyTriangle.vertexIds[localVertexIndex]}`,\n localVertexIndex,\n point: topology.vertices[topologyTriangle.vertexIds[localVertexIndex]],\n refKind: \"vertex\",\n vertexId: topologyTriangle.vertexIds[localVertexIndex],\n});\n\nconst edgePoint = (topology: MeshTopology, topologyTriangle: MeshTopologyTriangle, localEdgeIndex: number, point: Vec3): SegmentPoint => {\n const edgeId = topologyTriangle.edgeIds[localEdgeIndex];\n return {\n edgeId,\n key: `e:${edgeId}`,\n point,\n refKind: \"edge\",\n };\n};\n\nconst edgeVertexPoint = (\n topology: MeshTopology,\n topologyTriangle: MeshTopologyTriangle,\n localVertexIndex: number,\n localEdgeIndex: number,\n): SegmentPoint => vertexPoint(topology, topologyTriangle, localVertexIndex, topologyTriangle.edgeIds[localEdgeIndex]);\n\nconst activeTriangle = (topology: MeshTopology, triangleId: number) => !topology.triangles[triangleId]?.skipReason;\n\nconst edgeOppositeSide = (\n topologyTriangle: MeshTopologyTriangle,\n edgeVertexIds: readonly [number, number],\n sides: readonly [number, number, number],\n) => {\n const localIndex = topologyTriangle.vertexIds.findIndex(\n (vertexId) => vertexId !== edgeVertexIds[0] && vertexId !== edgeVertexIds[1],\n );\n return localIndex >= 0 ? sides[localIndex] : 0;\n};\n\nconst shouldEmitOnPlaneEdge = (\n topology: MeshTopology,\n edgeId: number,\n currentTriangleId: number,\n triangleSides: ReadonlyMap<number, [number, number, number]>,\n coplanarTriangles: ReadonlySet<number>,\n) => {\n const edge = topology.edges[edgeId];\n const activeAdjacentIds = edge.triangleIds.filter((triangleId) => activeTriangle(topology, triangleId));\n const coplanarAdjacentCount = activeAdjacentIds.filter((triangleId) => coplanarTriangles.has(triangleId)).length;\n\n if (coplanarAdjacentCount > 0) {\n return false;\n }\n\n const oppositeSigns = new Set<number>();\n for (const triangleId of activeAdjacentIds) {\n const sides = triangleSides.get(triangleId);\n if (!sides) continue;\n const side = edgeOppositeSide(topology.triangles[triangleId], edge.vertexIds, sides);\n if (side !== 0) oppositeSigns.add(side);\n }\n\n const nonCoplanarAdjacentIds = activeAdjacentIds.filter((triangleId) => !coplanarTriangles.has(triangleId));\n if (oppositeSigns.has(1) && oppositeSigns.has(-1)) {\n const positiveOwner = nonCoplanarAdjacentIds.find((triangleId) => {\n const sides = triangleSides.get(triangleId);\n if (!sides) return false;\n return edgeOppositeSide(topology.triangles[triangleId], edge.vertexIds, sides) > 0;\n });\n return currentTriangleId === (positiveOwner ?? Math.min(...nonCoplanarAdjacentIds));\n }\n\n return false;\n};\n\nconst shouldEmitCoplanarBoundaryEdge = (\n topology: MeshTopology,\n edgeId: number,\n triangleSides: ReadonlyMap<number, [number, number, number]>,\n coplanarTriangles: ReadonlySet<number>,\n) => {\n const edge = topology.edges[edgeId];\n const activeAdjacentIds = edge.triangleIds.filter((triangleId) => activeTriangle(topology, triangleId));\n const coplanarAdjacentIds = activeAdjacentIds.filter((triangleId) => coplanarTriangles.has(triangleId));\n\n if (coplanarAdjacentIds.length >= 2) return false;\n if (edge.kind === \"boundary\") return true;\n\n const nonCoplanarSides = activeAdjacentIds\n .filter((triangleId) => !coplanarTriangles.has(triangleId))\n .map((triangleId) => {\n const sides = triangleSides.get(triangleId);\n return sides ? edgeOppositeSide(topology.triangles[triangleId], edge.vertexIds, sides) : 0;\n })\n .filter((side) => side !== 0);\n\n return nonCoplanarSides.length > 0;\n};\n\nconst coplanarBoundarySegments = (\n topology: MeshTopology,\n topologyTriangle: MeshTopologyTriangle,\n triangleSides: ReadonlyMap<number, [number, number, number]>,\n coplanarTriangles: ReadonlySet<number>,\n) => {\n const segments: TriangleIntersection[] = [];\n\n for (let localEdgeIndex = 0; localEdgeIndex < 3; localEdgeIndex += 1) {\n const edgeId = topologyTriangle.edgeIds[localEdgeIndex];\n if (!shouldEmitCoplanarBoundaryEdge(topology, edgeId, triangleSides, coplanarTriangles)) continue;\n\n const [startIndex, endIndex] = localEdgeVertexIndices[localEdgeIndex];\n segments.push({\n kind: \"coplanarBoundary\",\n points: [\n vertexPoint(topology, topologyTriangle, startIndex, edgeId),\n vertexPoint(topology, topologyTriangle, endIndex, edgeId),\n ],\n });\n }\n\n return segments.filter((segment) => segment.points[0].key !== segment.points[1].key);\n};\n\nconst trianglePlaneSegments = (\n triangle: MeshTriangle,\n topology: MeshTopology,\n topologyTriangle: MeshTopologyTriangle,\n triangleDistances: ReadonlyMap<number, [number, number, number]>,\n triangleSides: ReadonlyMap<number, [number, number, number]>,\n coplanarTriangles: ReadonlySet<number>,\n epsilon: number,\n): TriangleIntersection[] => {\n const vertices = [triangle.a, triangle.b, triangle.c];\n const distances = triangleDistances.get(topologyTriangle.sourceIndex);\n const sides = triangleSides.get(topologyTriangle.sourceIndex);\n const points: EdgeIntersectionPoint[] = [];\n\n if (!sides || !distances) return [];\n\n if (coplanarTriangles.has(topologyTriangle.sourceIndex)) {\n return coplanarBoundarySegments(topology, topologyTriangle, triangleSides, coplanarTriangles);\n }\n\n const onPlaneEdgeSegments: TriangleIntersection[] = [];\n for (let localEdgeIndex = 0; localEdgeIndex < 3; localEdgeIndex += 1) {\n const [i, j] = localEdgeVertexIndices[localEdgeIndex];\n if (sides[i] !== 0 || sides[j] !== 0) continue;\n const edgeId = topologyTriangle.edgeIds[localEdgeIndex];\n if (!shouldEmitOnPlaneEdge(topology, edgeId, topologyTriangle.sourceIndex, triangleSides, coplanarTriangles)) continue;\n onPlaneEdgeSegments.push({\n kind: \"onPlaneEdge\",\n points: [vertexPoint(topology, topologyTriangle, i, edgeId), vertexPoint(topology, topologyTriangle, j, edgeId)],\n });\n }\n\n if (onPlaneEdgeSegments.length > 0) return onPlaneEdgeSegments;\n\n for (let localEdgeIndex = 0; localEdgeIndex < 3; localEdgeIndex += 1) {\n const [i, j] = localEdgeVertexIndices[localEdgeIndex];\n const da = sides[i];\n const db = sides[j];\n const aOnPlane = da === 0;\n const bOnPlane = db === 0;\n\n if (aOnPlane && bOnPlane) {\n continue;\n }\n\n if (aOnPlane) {\n points.push({\n ...edgeVertexPoint(topology, topologyTriangle, i, localEdgeIndex),\n side: db,\n });\n continue;\n }\n\n if (bOnPlane) {\n points.push({\n ...edgeVertexPoint(topology, topologyTriangle, j, localEdgeIndex),\n side: da,\n });\n continue;\n }\n\n if ((da < 0 && db > 0) || (da > 0 && db < 0)) {\n const a = vertices[i];\n const b = vertices[j];\n const distanceA = distances[i];\n const distanceB = distances[j];\n const t = distanceA / (distanceA - distanceB);\n points.push({\n ...edgePoint(topology, topologyTriangle, localEdgeIndex, lerp3(a, b, t)),\n side: 0,\n });\n }\n }\n\n const unique = uniqueSegmentPoints(points);\n\n if (unique.length < 2) return [];\n if (unique.length === 2) return [{ kind: \"cross\", points: [unique[0], unique[1]] }];\n\n const nonVertexPoints = unique.filter((point) => typeof point.vertexId !== \"number\");\n const vertexPoints = unique.filter((point) => typeof point.vertexId === \"number\") as EdgeIntersectionPoint[];\n if (nonVertexPoints.length === 2) return [{ kind: \"cross\", points: [nonVertexPoints[0], nonVertexPoints[1]] }];\n\n const oppositeVertexPair =\n nonVertexPoints.length === 1\n ? vertexPoints.find((point) => {\n const otherVertexPoint = vertexPoints.find((candidate) => candidate !== point && candidate.side === -point.side);\n return point.side !== 0 && otherVertexPoint;\n })\n : undefined;\n\n if (nonVertexPoints.length === 1 && oppositeVertexPair) {\n return [{ kind: \"cross\", points: [oppositeVertexPair, nonVertexPoints[0]] }];\n }\n\n return [];\n};\n\ntype EndpointSnapResult = {\n ambiguousEndpointCount: number;\n snappedEndpointCount: number;\n snapGroupCount: number;\n};\n\ntype SnapEndpoint = {\n endpointIndex: 0 | 1;\n index: number;\n line: SectionIntersectionLine;\n point2: Vec2;\n point3: Vec3;\n};\n\nconst distanceSquared2 = (a: Vec2, b: Vec2) => {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n return dx * dx + dy * dy;\n};\n\nconst endpointCellKey = (point: Vec2, cellSize: number) => `${Math.floor(point[0] / cellSize)},${Math.floor(point[1] / cellSize)}`;\n\nconst setLineEndpoint = (endpoint: SnapEndpoint, key: string, point2: Vec2, point3: Vec3) => {\n if (endpoint.endpointIndex === 0) {\n endpoint.line.endpointKeys = [key, endpoint.line.endpointKeys[1]];\n endpoint.line.points2 = [point2, endpoint.line.points2[1]];\n endpoint.line.points3 = [point3, endpoint.line.points3[1]];\n return;\n }\n\n endpoint.line.endpointKeys = [endpoint.line.endpointKeys[0], key];\n endpoint.line.points2 = [endpoint.line.points2[0], point2];\n endpoint.line.points3 = [endpoint.line.points3[0], point3];\n};\n\nconst snapSectionLineEndpoints = (lines: SectionIntersectionLine[], snapRadius: number): EndpointSnapResult => {\n if (lines.length === 0 || snapRadius <= 0) {\n return {\n ambiguousEndpointCount: 0,\n snappedEndpointCount: 0,\n snapGroupCount: 0,\n };\n }\n\n const endpoints: SnapEndpoint[] = [];\n for (const line of lines) {\n endpoints.push(\n {\n endpointIndex: 0,\n index: endpoints.length,\n line,\n point2: line.points2[0],\n point3: line.points3[0],\n },\n {\n endpointIndex: 1,\n index: endpoints.length + 1,\n line,\n point2: line.points2[1],\n point3: line.points3[1],\n },\n );\n }\n\n const cellSize = Math.max(snapRadius, SNAP_EPSILON);\n const snapRadiusSquared = snapRadius * snapRadius;\n const buckets = new Map<string, number[]>();\n const parent = endpoints.map((_, index) => index);\n const rank = endpoints.map(() => 0);\n const nearest = new Map<number, { ambiguous: boolean; distanceSquared: number; index: number }>();\n let ambiguousEndpointCount = 0;\n\n const find = (index: number): number => {\n let root = index;\n while (parent[root] !== root) root = parent[root];\n while (parent[index] !== index) {\n const next = parent[index];\n parent[index] = root;\n index = next;\n }\n return root;\n };\n\n const union = (a: number, b: number) => {\n const aRoot = find(a);\n const bRoot = find(b);\n if (aRoot === bRoot) return;\n if (rank[aRoot] < rank[bRoot]) {\n parent[aRoot] = bRoot;\n return;\n }\n if (rank[aRoot] > rank[bRoot]) {\n parent[bRoot] = aRoot;\n return;\n }\n parent[bRoot] = aRoot;\n rank[aRoot] += 1;\n };\n\n for (const endpoint of endpoints) {\n const [cellX, cellY] = endpointCellKey(endpoint.point2, cellSize).split(\",\").map(Number);\n for (let dx = -1; dx <= 1; dx += 1) {\n for (let dy = -1; dy <= 1; dy += 1) {\n const bucket = buckets.get(`${cellX + dx},${cellY + dy}`);\n if (!bucket) continue;\n\n for (const candidateIndex of bucket) {\n const candidate = endpoints[candidateIndex];\n if (candidate.line.id === endpoint.line.id) continue;\n const distanceSquared = distanceSquared2(endpoint.point2, candidate.point2);\n if (distanceSquared > snapRadiusSquared) continue;\n\n const existing = nearest.get(endpoint.index);\n if (!existing || distanceSquared < existing.distanceSquared - SNAP_EPSILON) {\n nearest.set(endpoint.index, {\n ambiguous: false,\n distanceSquared,\n index: candidate.index,\n });\n } else if (Math.abs(distanceSquared - existing.distanceSquared) <= SNAP_EPSILON && existing.index !== candidate.index) {\n nearest.set(endpoint.index, {\n ...existing,\n ambiguous: true,\n });\n }\n\n const candidateExisting = nearest.get(candidate.index);\n if (!candidateExisting || distanceSquared < candidateExisting.distanceSquared - SNAP_EPSILON) {\n nearest.set(candidate.index, {\n ambiguous: false,\n distanceSquared,\n index: endpoint.index,\n });\n } else if (\n Math.abs(distanceSquared - candidateExisting.distanceSquared) <= SNAP_EPSILON &&\n candidateExisting.index !== endpoint.index\n ) {\n nearest.set(candidate.index, {\n ...candidateExisting,\n ambiguous: true,\n });\n }\n }\n }\n }\n\n const bucketKey = endpointCellKey(endpoint.point2, cellSize);\n const bucket = buckets.get(bucketKey);\n if (bucket) {\n bucket.push(endpoint.index);\n } else {\n buckets.set(bucketKey, [endpoint.index]);\n }\n }\n\n for (const [endpointIndex, candidate] of nearest) {\n if (candidate.ambiguous) {\n ambiguousEndpointCount += 1;\n continue;\n }\n\n const reverse = nearest.get(candidate.index);\n if (!reverse || reverse.ambiguous || reverse.index !== endpointIndex) continue;\n union(endpointIndex, candidate.index);\n }\n\n const groups = new Map<number, SnapEndpoint[]>();\n for (const endpoint of endpoints) {\n const root = find(endpoint.index);\n const group = groups.get(root);\n if (group) {\n group.push(endpoint);\n } else {\n groups.set(root, [endpoint]);\n }\n }\n\n let snapGroupCount = 0;\n let snappedEndpointCount = 0;\n for (const group of groups.values()) {\n if (group.length < 2) continue;\n\n const point2 = [\n group.reduce((sum, endpoint) => sum + endpoint.point2[0], 0) / group.length,\n group.reduce((sum, endpoint) => sum + endpoint.point2[1], 0) / group.length,\n ] as Vec2;\n const point3 = [\n group.reduce((sum, endpoint) => sum + endpoint.point3[0], 0) / group.length,\n group.reduce((sum, endpoint) => sum + endpoint.point3[1], 0) / group.length,\n group.reduce((sum, endpoint) => sum + endpoint.point3[2], 0) / group.length,\n ] as Vec3;\n const key = `snap:${snapGroupCount}`;\n\n for (const endpoint of group) {\n setLineEndpoint(endpoint, key, point2, point3);\n snappedEndpointCount += 1;\n }\n snapGroupCount += 1;\n }\n\n return {\n ambiguousEndpointCount,\n snappedEndpointCount,\n snapGroupCount,\n };\n};\n\nconst boundsFromLines = (lines: SectionIntersectionLine[]) => {\n if (lines.length === 0) {\n return {\n min: [0, 0],\n max: [0, 0],\n } as Bounds2;\n }\n\n return lines.reduce((bounds, line) => includePoint2(includePoint2(bounds, line.points2[0]), line.points2[1]), emptyBounds2());\n};\n\nconst intersectMeshWithPlaneCandidates = (\n mesh: Mesh,\n topology: MeshTopology,\n plane: PlaneSectionSpec,\n frame: Frame3,\n candidateTriangleIndices: readonly number[],\n epsilon: number,\n endpointSnapRadius: number,\n emitRawCurves: boolean,\n emitDiagnostics: boolean,\n): Section => {\n const openCurves: SectionCurve[] = [];\n const intersectionLines: SectionIntersectionLine[] = [];\n const canonicalPoints = new Map<string, CanonicalPoint>();\n const triangleDistances = new Map<number, [number, number, number]>();\n const triangleSides = new Map<number, [number, number, number]>();\n const distanceForTriangle = (triangleIndex: number) => {\n const existing = triangleDistances.get(triangleIndex);\n if (existing) return existing;\n const triangle = mesh.triangles[triangleIndex];\n const vertices = [triangle.a, triangle.b, triangle.c];\n const distances = vertices.map((point) => dot3(sub3(point, plane.origin), frame.normal)) as [number, number, number];\n triangleDistances.set(triangleIndex, distances);\n return distances;\n };\n const sideForTriangle = (triangleIndex: number) => {\n const existing = triangleSides.get(triangleIndex);\n if (existing) return existing;\n const sides = distanceForTriangle(triangleIndex).map((distance) => sideOfDistance(distance, epsilon)) as [number, number, number];\n triangleSides.set(triangleIndex, sides);\n return sides;\n };\n const coplanarTriangles = new Set<number>();\n let coplanarBoundarySegmentCount = 0;\n let onPlaneVertexSegmentCount = 0;\n let skippedTriangleCount = 0;\n let bounds = emptyBounds2();\n let endpointSnapResult: EndpointSnapResult = {\n ambiguousEndpointCount: 0,\n snappedEndpointCount: 0,\n snapGroupCount: 0,\n };\n\n for (const triangleIndex of candidateTriangleIndices) {\n const topologyTriangle = topology.triangles[triangleIndex];\n if (topologyTriangle.skipReason) continue;\n if (sideForTriangle(topologyTriangle.sourceIndex).every((side) => side === 0)) {\n coplanarTriangles.add(topologyTriangle.sourceIndex);\n }\n }\n\n const canonicalize = (segmentPoint: SegmentPoint): CanonicalPoint => {\n const existing = canonicalPoints.get(segmentPoint.key);\n if (existing) return existing;\n\n const canonical = {\n point2: projectPoint(segmentPoint.point, frame),\n point3: segmentPoint.point,\n };\n canonicalPoints.set(segmentPoint.key, canonical);\n return canonical;\n };\n\n for (const triangleIndex of candidateTriangleIndices) {\n const triangle = mesh.triangles[triangleIndex];\n const topologyTriangle = topology.triangles[triangleIndex];\n if (topologyTriangle.skipReason) {\n skippedTriangleCount += 1;\n continue;\n }\n\n const segments = trianglePlaneSegments(\n triangle,\n topology,\n topologyTriangle,\n triangleDistances,\n triangleSides,\n coplanarTriangles,\n epsilon,\n );\n\n if (coplanarTriangles.has(triangleIndex)) {\n coplanarBoundarySegmentCount += segments.length;\n } else if (segments.some((segment) => segment.kind === \"onPlaneEdge\")) {\n onPlaneVertexSegmentCount += segments.length;\n }\n\n for (const segment of segments) {\n const [segmentStart, segmentEnd] = orientedSegmentPoints(triangle, frame.normal, segment.points);\n const start = canonicalize(segmentStart);\n const end = canonicalize(segmentEnd);\n if (samePoint3(start.point3, end.point3, epsilon)) continue;\n\n const points2 = [start.point2, end.point2] as [Vec2, Vec2];\n const points3 = [start.point3, end.point3] as [Vec3, Vec3];\n const endpointKeys = [segmentStart.key, segmentEnd.key] as [string, string];\n const endpointRefs = [endpointReference(segmentStart), endpointReference(segmentEnd)] as [\n SectionEndpointReference,\n SectionEndpointReference,\n ];\n const startAddress = pointAddress(segmentStart, segment.kind);\n const endAddress = pointAddress(segmentEnd, segment.kind);\n bounds = includePoint2(includePoint2(bounds, points2[0]), points2[1]);\n\n intersectionLines.push({\n aId: startAddress.pointId,\n bId: endAddress.pointId,\n edgeAId: startAddress.edgeId,\n edgeBId: endAddress.edgeId,\n edgeType: segment.kind,\n id: intersectionLines.length,\n points2,\n points3,\n endpointKeys,\n endpointRefs,\n edgeIndex: segmentStart.edgeId ?? segmentEnd.edgeId,\n intersector: \"plane\",\n kind: segment.kind,\n noSeed: segment.kind !== \"cross\",\n skip: false,\n triangleEdgeIndices: topologyTriangle.edgeIds,\n triangleIndex,\n triangleVertexIndices: topologyTriangle.vertexIds,\n });\n\n if (emitRawCurves) {\n openCurves.push({\n id: `segment-${openCurves.length}`,\n points2,\n points3,\n closed: false,\n role: \"unknown\",\n source: {\n edgeIndex: segmentStart.edgeId ?? segmentEnd.edgeId,\n endpointKeys,\n endpointRefs,\n intersector: \"plane\",\n kind: segment.kind,\n triangleEdgeIndices: topologyTriangle.edgeIds,\n triangleIndex,\n triangleVertexIndices: topologyTriangle.vertexIds,\n },\n });\n }\n }\n }\n\n if (!emitRawCurves) {\n endpointSnapResult = snapSectionLineEndpoints(intersectionLines, endpointSnapRadius);\n bounds = boundsFromLines(intersectionLines);\n } else if (intersectionLines.length === 0) {\n bounds = {\n min: [0, 0],\n max: [0, 0],\n };\n }\n\n return {\n id: `${mesh.id}:plane:${plane.origin.join(\",\")}:${plane.normal.join(\",\")}`,\n spec: plane,\n frame,\n curves: [],\n intersectionLines,\n openCurves,\n rawCurves: emitRawCurves ? openCurves : undefined,\n bounds,\n diagnostics: emitDiagnostics\n ? [\n {\n level: intersectionLines.length > 0 ? \"info\" : \"warning\",\n message: `${intersectionLines.length} section segments generated from ${topology.diagnostics.sharedVertexCount} shared mesh vertices.`,\n },\n {\n level: topology.diagnostics.nonManifoldEdgeCount > 0 || topology.diagnostics.boundaryEdgeCount > 0 ? \"warning\" : \"info\",\n message: `${topology.diagnostics.manifoldEdgeCount} manifold edges, ${topology.diagnostics.boundaryEdgeCount} boundary edges, and ${topology.diagnostics.nonManifoldEdgeCount} non-manifold edges classified.`,\n },\n ...(skippedTriangleCount > 0\n ? [\n {\n level: \"info\" as const,\n message: `${topology.diagnostics.degenerateTriangleCount} degenerate triangles and ${topology.diagnostics.duplicateTriangleCount} duplicate triangles skipped by mesh topology normalization.`,\n },\n ]\n : []),\n ...(coplanarTriangles.size > 0 || coplanarBoundarySegmentCount > 0 || onPlaneVertexSegmentCount > 0\n ? [\n {\n level: \"info\" as const,\n message: `${coplanarTriangles.size} coplanar triangles produced ${coplanarBoundarySegmentCount} boundary segments; ${onPlaneVertexSegmentCount} on-plane vertex/edge segments emitted.`,\n },\n ]\n : []),\n ...(endpointSnapResult.snapGroupCount > 0 || endpointSnapResult.ambiguousEndpointCount > 0\n ? [\n {\n level: \"info\" as const,\n message: `${endpointSnapResult.snappedEndpointCount} section endpoints snapped into ${endpointSnapResult.snapGroupCount} groups; ${endpointSnapResult.ambiguousEndpointCount} ambiguous snap candidates ignored.`,\n },\n ]\n : []),\n ]\n : [],\n };\n};\n\nconst createPlaneSectionEvaluator = (\n mesh: Mesh,\n topology: MeshTopology,\n epsilon: number,\n endpointSnapRadius: number,\n emitRawCurves: boolean,\n emitDiagnostics: boolean,\n): SectionEvaluator<PlaneSectionSpec> => ({\n kind: \"plane\",\n intersect: (plane) => {\n const frame = frameFromPlane(plane);\n const candidateTriangleIndices = getTriangleIndicesForPlane(topology, frame.origin, frame.normal, epsilon);\n return intersectMeshWithPlaneCandidates(\n mesh,\n topology,\n plane,\n frame,\n candidateTriangleIndices,\n epsilon,\n endpointSnapRadius,\n emitRawCurves,\n emitDiagnostics,\n );\n },\n intersectStack: (planes) => {\n if (planes.length === 0) return [];\n\n const frames = planes.map(frameFromPlane);\n const baseNormal = frames[0].normal;\n const canBatch = frames.every((frame) => sameNormal(frame.normal, baseNormal));\n\n if (!canBatch) {\n return planes.map((plane, index) => {\n const candidateTriangleIndices = getTriangleIndicesForPlane(topology, frames[index].origin, frames[index].normal, epsilon);\n return intersectMeshWithPlaneCandidates(\n mesh,\n topology,\n plane,\n frames[index],\n candidateTriangleIndices,\n epsilon,\n endpointSnapRadius,\n emitRawCurves,\n emitDiagnostics,\n );\n });\n }\n\n const offsets = frames.map((frame) => dot3(frame.origin, baseNormal));\n const candidateGroups = getTriangleIndicesForParallelPlanes(topology, baseNormal, offsets, epsilon);\n return planes.map((plane, index) =>\n intersectMeshWithPlaneCandidates(\n mesh,\n topology,\n plane,\n frames[index],\n candidateGroups[index],\n epsilon,\n endpointSnapRadius,\n emitRawCurves,\n emitDiagnostics,\n ),\n );\n },\n});\n\nexport const intersectMeshWithPlane = (mesh: Mesh, plane: PlaneSectionSpec, options: SliceOptions = {}): Section => {\n const epsilon = options.intersectionEpsilon ?? DEFAULT_INTERSECTION_EPSILON;\n const topologyEpsilon = options.topologyEpsilon ?? DEFAULT_TOPOLOGY_EPSILON;\n const topology = getMeshTopology(mesh, Math.max(epsilon, topologyEpsilon));\n const endpointSnapRadius = options.connect === false ? 0 : options.closingRadius ?? DEFAULT_SLICE_CLOSING_RADIUS;\n return createPlaneSectionEvaluator(\n mesh,\n topology,\n epsilon,\n endpointSnapRadius,\n options.connect === false,\n options.diagnostics !== \"none\",\n ).intersect(plane);\n};\n\nexport const intersectMeshWithPlaneStack = (mesh: Mesh, planes: PlaneSectionSpec[], options: SliceOptions = {}) => {\n if (planes.length === 0) return [];\n\n const epsilon = options.intersectionEpsilon ?? DEFAULT_INTERSECTION_EPSILON;\n const topologyEpsilon = options.topologyEpsilon ?? DEFAULT_TOPOLOGY_EPSILON;\n const topology = getMeshTopology(mesh, Math.max(epsilon, topologyEpsilon));\n const endpointSnapRadius = options.connect === false ? 0 : options.closingRadius ?? DEFAULT_SLICE_CLOSING_RADIUS;\n return createPlaneSectionEvaluator(\n mesh,\n topology,\n epsilon,\n endpointSnapRadius,\n options.connect === false,\n options.diagnostics !== \"none\",\n ).intersectStack(planes);\n};\n\nexport const intersectMeshWithSection = (mesh: Mesh, spec: SectionSpec, options: SliceOptions = {}) => {\n if (spec.kind === \"plane\") return intersectMeshWithPlane(mesh, spec, options);\n throw new Error(`Section intersector is not implemented for ${spec.kind} sections yet.`);\n};\n\nexport const sliceMeshWithPlane = intersectMeshWithPlane;\n", "import type { PrintStats, ToolpathGraph, ToolpathPath, ToolpathPoint } from \"./types\";\n\nconst distance = (a: ToolpathPoint, b: ToolpathPoint) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dz = b.z - a.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n};\n\nconst pathDistance = (path: ToolpathPath) => {\n let total = 0;\n\n for (let i = 1; i < path.points.length; i += 1) {\n total += distance(path.points[i - 1], path.points[i]);\n }\n\n if (path.closed && path.points.length > 2) {\n total += distance(path.points[path.points.length - 1], path.points[0]);\n }\n\n return total;\n};\n\nexport const calculatePrintStats = (graph: Omit<ToolpathGraph, \"stats\">): PrintStats => {\n let travelDistanceMm = 0;\n let extrusionDistanceMm = 0;\n let estimatedExtrusionMm = 0;\n let pathCount = 0;\n\n for (const layer of graph.layers) {\n for (const path of layer.paths) {\n pathCount += 1;\n const length = pathDistance(path);\n\n if (path.role === \"travel\") {\n travelDistanceMm += length;\n } else {\n extrusionDistanceMm += length;\n estimatedExtrusionMm += length * (path.extrusion?.flow ?? 0.045);\n }\n }\n }\n\n return {\n layerCount: graph.layers.length,\n pathCount,\n travelDistanceMm,\n extrusionDistanceMm,\n estimatedExtrusionMm,\n };\n};\n", "import type { Vec2 } from \"../types\";\nimport { clipperKernel, clipperPaths64ToPointLists, createClipperPaths64 } from \"./clipper\";\nimport { dedupeRing2, signedArea2 } from \"./cleanup\";\n\ntype BooleanOperation = \"difference\" | \"intersection\" | \"union\" | \"xor\";\n\ntype BooleanOptions = {\n areaEpsilon?: number;\n distanceEpsilon?: number;\n};\n\nconst DEFAULT_AREA_EPSILON = 1e-6;\nconst DEFAULT_DISTANCE_EPSILON = 1e-5;\n\nconst validRings = (rings: readonly (readonly Vec2[])[], options: BooleanOptions = {}) => {\n const areaEpsilon = options.areaEpsilon ?? DEFAULT_AREA_EPSILON;\n const distanceEpsilon = options.distanceEpsilon ?? DEFAULT_DISTANCE_EPSILON;\n\n return rings.flatMap((ring): Vec2[][] => {\n const cleaned = dedupeRing2(ring, distanceEpsilon);\n if (cleaned.length < 3 || Math.abs(signedArea2(cleaned)) <= areaEpsilon) return [];\n return [cleaned];\n });\n};\n\nexport const booleanRings2 = (\n subjectRings: readonly (readonly Vec2[])[],\n clipRings: readonly (readonly Vec2[])[],\n operation: BooleanOperation,\n options: BooleanOptions = {},\n) => {\n const subject = validRings(subjectRings, options);\n const clip = validRings(clipRings, options);\n if (subject.length === 0) return [];\n if (clip.length === 0 && operation === \"difference\") return subject;\n if (clip.length === 0 && operation === \"union\") return subject;\n if (clip.length === 0) return [];\n\n const module = clipperKernel();\n const subjectPaths = createClipperPaths64(module, subject);\n const clipPaths = createClipperPaths64(module, clip);\n let result;\n\n try {\n const clipType = operation === \"difference\"\n ? module.ClipType.Difference\n : operation === \"intersection\"\n ? module.ClipType.Intersection\n : operation === \"union\"\n ? module.ClipType.Union\n : module.ClipType.Xor;\n\n result = module.BooleanOp64(clipType, module.FillRule.NonZero, subjectPaths.paths, clipPaths.paths);\n return validRings(clipperPaths64ToPointLists(result), options);\n } finally {\n result?.delete();\n clipPaths.release();\n subjectPaths.release();\n }\n};\n\nexport const unionRings2 = (rings: readonly (readonly Vec2[])[], options: BooleanOptions = {}) => {\n const source = validRings(rings, options);\n if (source.length === 0) return [];\n\n const module = clipperKernel();\n const sourcePaths = createClipperPaths64(module, source);\n let result;\n\n try {\n result = module.UnionSelf64(sourcePaths.paths, module.FillRule.NonZero);\n return validRings(clipperPaths64ToPointLists(result), options);\n } finally {\n result?.delete();\n sourcePaths.release();\n }\n};\n", "import type { Vec2, Vec3 } from \"../geometry/types\";\nimport { booleanRings2, unionRings2 } from \"../geometry/kernel/boolean\";\nimport { pointInPolygon2 } from \"../geometry/kernel/classify\";\nimport { bounds2, signedArea2 } from \"../geometry/kernel/cleanup\";\nimport { offsetRegionRings2 } from \"../geometry/kernel/offset\";\nimport { clipSegmentsToPolygons } from \"../geometry/kernel/lineClip\";\nimport type { Segment2 } from \"../geometry/kernel/types\";\nimport type { Section } from \"../section/types\";\nimport { classifySectionCurves } from \"../section/classify\";\nimport type { ToolpathPath, ToolpathRole } from \"./types\";\n\ntype DiagnosticLevel = \"info\" | \"warning\" | \"error\";\ntype DiagnosticReporter = (message: string, level?: DiagnosticLevel) => void;\n\ntype LineFillOptions = {\n angle?: number;\n density?: number;\n field?: FillField;\n idPrefix?: string;\n layerHeight: number;\n layerIndex: number;\n lineWidth: number;\n margin?: number;\n onDiagnostic?: DiagnosticReporter;\n pattern?: InfillPattern;\n role?: ToolpathRole;\n spacing?: number;\n};\n\ntype SolidFillOptions = {\n angle?: number;\n field?: FillField;\n layerHeight: number;\n layerIndex?: number;\n lineWidth: number;\n margin?: number;\n onDiagnostic?: DiagnosticReporter;\n pattern?: InfillPattern;\n solidLayers?: number;\n};\n\ntype FillLayerOptions = {\n bottomAngle?: number;\n bottomPattern?: InfillPattern;\n density?: number;\n field?: FillField;\n layerHeight: number;\n layerIndex?: number;\n lineWidth: number;\n margin?: number;\n onDiagnostic?: DiagnosticReporter;\n pattern?: InfillPattern;\n solidLayers?: number;\n sparseAngle?: number;\n sparsePattern?: InfillPattern;\n sparseSpacing?: number;\n topAngle?: number;\n topPattern?: InfillPattern;\n};\n\nexport type InfillPattern = \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n\nexport type FillFieldAnchor = \"build\" | \"regionCenter\" | \"section\";\n\nexport type FillField = {\n anchor?: FillFieldAnchor;\n origin?: Vec2 | Vec3;\n phase?: number;\n};\n\nexport type Region2D = {\n bounds: Section[\"bounds\"];\n diagnostics: Section[\"diagnostics\"];\n frame: Section[\"frame\"];\n id: string;\n rings: Vec2[][];\n source: Section;\n};\n\nexport type FillRegion = Region2D;\n\ntype RegionPathOptions = {\n id?: string;\n layerHeight?: number;\n layerIndex?: number;\n lineWidth?: number;\n};\n\ntype RegionRingOptions = {\n hole?: boolean;\n};\n\ntype RegionCircleOptions = RegionRingOptions & {\n segments?: number;\n};\n\ntype FillRegionOptions = {\n angle?: number;\n density?: number;\n field?: FillField;\n layerHeight?: number;\n layerIndex?: number;\n lineWidth?: number;\n pattern?: InfillPattern;\n role?: ToolpathRole;\n spacing?: number;\n};\n\ntype FillRegionTarget = Section | Region2D | { section: Section } | { toRegion: () => Region2D };\n\ntype ScanSegment2 = Segment2 & {\n scanIndex: number;\n};\n\nexport type FillLayerResult = {\n bottom: ToolpathPath[];\n paths: ToolpathPath[];\n regions: {\n bottom: Section;\n inset: Section;\n sparse: Section;\n top: Section;\n };\n sparse: ToolpathPath[];\n top: ToolpathPath[];\n};\n\nconst toPoint3 = (section: Section, point: Vec2): Vec3 => [\n section.frame.origin[0] + section.frame.xAxis[0] * point[0] + section.frame.yAxis[0] * point[1],\n section.frame.origin[1] + section.frame.xAxis[1] * point[0] + section.frame.yAxis[1] * point[1],\n section.frame.origin[2] + section.frame.xAxis[2] * point[0] + section.frame.yAxis[2] * point[1],\n];\n\nconst dot3 = (a: Vec3, b: Vec3) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n\nconst sub3 = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n\nconst near = (a: number, b: number, epsilon = 1e-8) => Math.abs(a - b) <= epsilon;\n\nconst sameVec3 = (a: Vec3, b: Vec3, epsilon = 1e-8) =>\n near(a[0], b[0], epsilon) && near(a[1], b[1], epsilon) && near(a[2], b[2], epsilon);\n\nconst sharesSectionFrame2D = (target: Section, source: Section) => {\n if (!sameVec3(target.frame.xAxis, source.frame.xAxis) || !sameVec3(target.frame.yAxis, source.frame.yAxis)) return false;\n\n const originDelta = sub3(source.frame.origin, target.frame.origin);\n return near(dot3(originDelta, target.frame.xAxis), 0) && near(dot3(originDelta, target.frame.yAxis), 0);\n};\n\nconst projectPointToSectionFrame = (section: Section, point: Vec3): Vec2 => {\n const relative = sub3(point, section.frame.origin);\n return [dot3(relative, section.frame.xAxis), dot3(relative, section.frame.yAxis)];\n};\n\nconst sectionRings = (section: Section) =>\n section.curves.flatMap((curve): Vec2[][] => {\n if (curve.role === \"invalid\" || curve.role === \"open\" || curve.points2.length < 3) return [];\n return [curve.points2];\n });\n\nconst sectionRegionRings = (section: Section) =>\n section.curves.flatMap((curve) => {\n if (curve.role === \"invalid\" || curve.role === \"open\" || curve.points2.length < 3) return [];\n return [{\n points: curve.points2,\n role: curve.role,\n }];\n });\n\nconst regionRingsWithRoles = (base: Section, rings: readonly (readonly Vec2[])[]) =>\n sectionRegionRings(sectionFromRings(base, rings, \"role-source\"));\n\nconst sectionFromRings = (base: Section, rings: readonly (readonly Vec2[])[], idSuffix: string): Section => {\n const curves = rings.map((ring, index) => ({\n id: `${base.id}-${idSuffix}-${index}`,\n points2: [...ring],\n points3: ring.map((point) => toPoint3(base, point)),\n closed: true,\n role: \"unknown\" as const,\n }));\n const classifiedCurves = classifySectionCurves(base, curves).map((curve) => orientRegionCurve(base, curve));\n const points = classifiedCurves.flatMap((curve) => curve.points2);\n\n return {\n ...base,\n id: `${base.id}-${idSuffix}`,\n curves: classifiedCurves,\n openCurves: [],\n rawCurves: undefined,\n intersectionLines: undefined,\n bounds: points.length > 0 ? bounds2(points) : { min: [0, 0], max: [0, 0] },\n };\n};\n\nconst regionBounds = (rings: readonly (readonly Vec2[])[]) => bounds2(rings.flatMap((ring) => [...ring]));\n\nconst regionFromSection = (section: Section, idSuffix: string): Region2D => ({\n bounds: section.bounds,\n diagnostics: section.diagnostics,\n frame: section.frame,\n id: `${section.id}-${idSuffix}`,\n rings: sectionRings(section),\n source: section,\n});\n\nconst createRegionSection = (z: number, rings: readonly (readonly Vec2[])[], options: RegionPathOptions = {}): Section => {\n const frame: Section[\"frame\"] = {\n origin: [0, 0, z],\n xAxis: [1, 0, 0],\n yAxis: [0, 1, 0],\n normal: [0, 0, 1],\n };\n const curves = rings.map((ring, index) => ({\n id: `${options.id ?? \"path-region\"}-${index}`,\n points2: [...ring],\n points3: ring.map(([x, y]) => [x, y, z] satisfies Vec3),\n closed: true,\n role: \"unknown\" as const,\n }));\n const base: Section = {\n id: options.id ?? `path-region-${z.toFixed(3)}`,\n spec: {\n kind: \"plane\",\n origin: frame.origin,\n normal: frame.normal,\n xAxis: frame.xAxis,\n },\n frame,\n curves: [],\n openCurves: [],\n bounds: regionBounds(rings),\n diagnostics: [],\n };\n const classifiedCurves = classifySectionCurves(base, curves).map((curve) => orientRegionCurve(base, curve));\n const points = classifiedCurves.flatMap((curve) => curve.points2);\n\n return {\n ...base,\n curves: classifiedCurves,\n bounds: points.length > 0 ? bounds2(points) : base.bounds,\n };\n};\n\nconst ringWithOrientation = (points: readonly Vec2[], hole?: boolean): Vec2[] => {\n const ring = [...points];\n if (ring.length < 3) return ring;\n\n const shouldBeCcw = !hole;\n const isCcw = signedArea2(ring) >= 0;\n\n return shouldBeCcw === isCcw ? ring : ring.reverse();\n};\n\nconst orientRegionCurve = (section: Section, curve: Section[\"curves\"][number]) => {\n if (curve.role === \"invalid\" || curve.role === \"open\" || curve.points2.length < 3) return curve;\n\n const shouldBeCcw = curve.role !== \"hole\";\n const isCcw = signedArea2(curve.points2) >= 0;\n const points2 = shouldBeCcw === isCcw ? [...curve.points2] : [...curve.points2].reverse();\n\n return {\n ...curve,\n area: signedArea2(points2),\n points2,\n points3: points2.map((point) => toPoint3(section, point)),\n winding: signedArea2(points2) >= 0 ? (\"ccw\" as const) : (\"cw\" as const),\n };\n};\n\nexport const pathRegion = (z: number, options: RegionPathOptions = {}) => {\n const rings: Vec2[][] = [];\n let cachedRegion: Region2D | undefined;\n\n const invalidate = () => {\n cachedRegion = undefined;\n };\n\n const create = (): Region2D => {\n cachedRegion ??= regionFromSection(createRegionSection(z, rings, options), \"region\");\n return cachedRegion;\n };\n\n const api = {\n get bounds() {\n return create().bounds;\n },\n get frame() {\n return create().frame;\n },\n get id() {\n return create().id;\n },\n get rings() {\n return create().rings;\n },\n get source() {\n return create().source;\n },\n circle: (center: Vec2, radius: number, circleOptions: RegionCircleOptions = {}) => {\n const segmentCount = Math.max(8, Math.round(circleOptions.segments ?? 64));\n const points = Array.from({ length: segmentCount }, (_value, index) => {\n const angle = (index / segmentCount) * Math.PI * 2;\n return [center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius] satisfies Vec2;\n });\n rings.push(ringWithOrientation(points, circleOptions.hole));\n invalidate();\n return api;\n },\n fill: (fillOptions: FillRegionOptions) => fillRegionPaths(create(), fillOptions),\n hole: (points: readonly Vec2[]) => {\n rings.push(ringWithOrientation(points, true));\n invalidate();\n return api;\n },\n inset: (distance: number) => {\n const region = create();\n if (distance <= 0) return region;\n const offset = offsetRegionRings2(\n sectionRegionRings(region.source),\n distance,\n );\n return regionFromRings(region, offset.ok ? offset.rings : [], `inset-${distance.toFixed(3)}`, offset.warnings.map((message) => ({\n level: \"info\" as const,\n message: `Offset region: ${message}.`,\n })));\n },\n polygon: (points: readonly Vec2[], ringOptions: RegionRingOptions = {}) => {\n rings.push(ringWithOrientation(points, ringOptions.hole));\n invalidate();\n return api;\n },\n ring: (points: readonly Vec2[], ringOptions: RegionRingOptions = {}) => {\n rings.push(ringWithOrientation(points, ringOptions.hole));\n invalidate();\n return api;\n },\n toRegion: create,\n toSection: () => create().source,\n };\n\n return api;\n};\n\nconst regionFromRings = (\n base: Section | Region2D,\n rings: readonly (readonly Vec2[])[],\n idSuffix: string,\n diagnostics: Section[\"diagnostics\"] = [],\n): Region2D => {\n const source = \"source\" in base ? base.source : base;\n const ownedRings = rings.map((ring) => [...ring]);\n\n return {\n bounds: regionBounds(ownedRings),\n diagnostics,\n frame: base.frame,\n id: `${base.id}-${idSuffix}`,\n rings: ownedRings,\n source,\n };\n};\n\nconst sectionFromRegion = (region: Region2D, idSuffix: string) => {\n const section = sectionFromRings(region.source, region.rings, `${region.id}-${idSuffix}`);\n return {\n ...section,\n diagnostics: [...region.source.diagnostics, ...region.diagnostics],\n };\n};\n\nconst lazySection = (create: () => Section) => {\n let cached: Section | undefined;\n\n return () => {\n cached ??= create();\n return cached;\n };\n};\n\nconst lazyRegionSections = (regions: SolidRegionSet, inset: Region2D) => {\n const bottom = lazySection(() => sectionFromRegion(regions.bottom, \"section\"));\n const sparse = lazySection(() => sectionFromRegion(regions.sparse, \"section\"));\n const top = lazySection(() => sectionFromRegion(regions.top, \"section\"));\n const insetSection = lazySection(() => sectionFromRegion(inset, \"section\"));\n\n return {\n get bottom() {\n return bottom();\n },\n get inset() {\n return insetSection();\n },\n get sparse() {\n return sparse();\n },\n get top() {\n return top();\n },\n };\n};\n\nconst projectRegionRingsToFrame = (target: Region2D, source: Region2D) => {\n if (sharesSectionFrame2D(target.source, source.source)) return source.rings;\n\n return source.rings.map((ring) =>\n ring.map((point) => projectPointToSectionFrame(target.source, toPoint3(source.source, point))),\n );\n};\n\nconst rotate = (point: Vec2, radians: number): Vec2 => {\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n\n return [point[0] * cos - point[1] * sin, point[0] * sin + point[1] * cos];\n};\n\nconst unrotate = (point: Vec2, radians: number): Vec2 => rotate(point, -radians);\n\nconst rotatedBoundsForRings = (rings: readonly (readonly Vec2[])[], radians: number) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const ring of rings) {\n for (const point of ring) {\n const rotated = rotate(point, radians);\n minX = Math.min(minX, rotated[0]);\n minY = Math.min(minY, rotated[1]);\n maxX = Math.max(maxX, rotated[0]);\n maxY = Math.max(maxY, rotated[1]);\n }\n }\n\n if (!Number.isFinite(minX)) {\n return {\n min: [0, 0] satisfies Vec2,\n max: [0, 0] satisfies Vec2,\n };\n }\n\n return {\n min: [minX, minY] satisfies Vec2,\n max: [maxX, maxY] satisfies Vec2,\n };\n};\n\nconst spacingFromDensity = (density: number, lineWidth: number) => {\n const clamped = Math.max(0, Math.min(1, density));\n if (clamped <= 0) return Infinity;\n return clamped >= 1 ? lineWidth : Math.max(lineWidth, lineWidth / clamped);\n};\n\nconst scanLinePositions = (minY: number, maxY: number, spacing: number, anchorY?: number, phase = 0) => {\n const height = maxY - minY;\n const center = (minY + maxY) / 2;\n\n if (anchorY !== undefined && Number.isFinite(anchorY)) {\n const startIndex = Math.floor((minY - anchorY - phase) / spacing);\n const endIndex = Math.ceil((maxY - anchorY - phase) / spacing);\n return Array.from({ length: Math.max(1, endIndex - startIndex + 1) }, (_value, index) =>\n anchorY + phase + (startIndex + index) * spacing,\n );\n }\n\n if (height <= 0) return [center];\n\n const count = Math.max(1, Math.ceil(height / spacing));\n const usedHeight = (count - 1) * spacing;\n const startY = center - usedHeight / 2;\n\n return Array.from({ length: count }, (_value, index) => startY + index * spacing);\n};\n\nconst fieldOriginToSectionPoint = (section: Section, field: FillField | undefined): Vec2 => {\n const anchor = field?.anchor ?? \"build\";\n const origin = field?.origin;\n\n if (anchor === \"section\") {\n return [\n typeof origin?.[0] === \"number\" ? origin[0] : 0,\n typeof origin?.[1] === \"number\" ? origin[1] : 0,\n ];\n }\n\n const origin3: Vec3 = [\n typeof origin?.[0] === \"number\" ? origin[0] : 0,\n typeof origin?.[1] === \"number\" ? origin[1] : 0,\n typeof origin?.[2] === \"number\" ? origin[2] : 0,\n ];\n return projectPointToSectionFrame(section, origin3);\n};\n\nconst scanAnchorY = (section: Section, field: FillField | undefined, radians: number) => {\n if (field?.anchor === \"regionCenter\") return undefined;\n return rotate(fieldOriginToSectionPoint(section, field), radians)[1];\n};\n\nconst distance2 = (a: Vec2, b: Vec2) => Math.hypot(b[0] - a[0], b[1] - a[1]);\n\nconst samePoint2 = (a: Vec2, b: Vec2, epsilon = 1e-7) => distance2(a, b) <= epsilon;\n\nconst segmentLength2 = (segment: Segment2) => distance2(segment.start, segment.end);\n\nconst distanceToSegment2 = (point: Vec2, start: Vec2, end: Vec2) => {\n const dx = end[0] - start[0];\n const dy = end[1] - start[1];\n const lengthSquared = dx * dx + dy * dy;\n const t = lengthSquared <= 0\n ? 0\n : Math.max(0, Math.min(1, ((point[0] - start[0]) * dx + (point[1] - start[1]) * dy) / lengthSquared));\n const closest: Vec2 = [start[0] + dx * t, start[1] + dy * t];\n return distance2(point, closest);\n};\n\nconst pointOnRegionBoundary = (point: Vec2, rings: readonly (readonly Vec2[])[], epsilon = 1e-5) => {\n for (const ring of rings) {\n if (ring.length < 2) continue;\n for (let index = 0; index < ring.length; index += 1) {\n if (distanceToSegment2(point, ring[index], ring[(index + 1) % ring.length]) <= epsilon) return true;\n }\n }\n\n return false;\n};\n\nconst pointInRegionOrBoundary = (point: Vec2, rings: readonly (readonly Vec2[])[]) => {\n if (pointOnRegionBoundary(point, rings)) return true;\n return rings.filter((ring) => ring.length >= 3 && pointInPolygon2(point, ring)).length % 2 === 1;\n};\n\nconst connectorSamplesStayInsideRegion = (start: Vec2, end: Vec2, rings: readonly (readonly Vec2[])[]) => {\n for (let index = 1; index < 10; index += 1) {\n const t = index / 10;\n const point: Vec2 = [start[0] + (end[0] - start[0]) * t, start[1] + (end[1] - start[1]) * t];\n if (!pointInRegionOrBoundary(point, rings)) return false;\n }\n\n return true;\n};\n\nconst connectorStaysInsideRegion = (start: Vec2, end: Vec2, rings: readonly (readonly Vec2[])[]) => {\n const connector = { start, end };\n const connectorLength = segmentLength2(connector);\n if (connectorLength <= 1e-7) return true;\n\n const clippedLength = clipSegmentsToPolygons([connector], rings, () => true, {\n minLength: 1e-6,\n }).reduce((total, segment) => total + segmentLength2(segment), 0);\n\n return clippedLength >= connectorLength - 1e-5 || connectorSamplesStayInsideRegion(start, end, rings);\n};\n\ntype SolidRegionSet = {\n bottom: Region2D;\n sparse: Region2D;\n top: Region2D;\n};\n\nconst fillInsetRegionCache = new WeakMap<Section, Map<string, Region2D>>();\nconst solidRegionCache = new WeakMap<Region2D, Map<string, SolidRegionSet>>();\n\nconst insetRegionKey = (margin: number) => margin.toFixed(6);\n\nconst getFillInsetRegion = (section: Section, margin: number) => {\n let sectionCache = fillInsetRegionCache.get(section);\n if (!sectionCache) {\n sectionCache = new Map();\n fillInsetRegionCache.set(section, sectionCache);\n }\n\n const key = insetRegionKey(margin);\n const cached = sectionCache.get(key);\n if (cached) return cached;\n\n if (margin <= 0) {\n const region = regionFromSection(section, \"fill-region\");\n sectionCache.set(key, region);\n return region;\n }\n\n const diagnostics: Section[\"diagnostics\"] = [];\n const offset = offsetRegionRings2(sectionRegionRings(section), margin);\n\n for (const warning of offset.warnings) {\n diagnostics.push({\n level: \"info\",\n message: `Offset region: ${warning}.`,\n });\n }\n\n if (offset.ok === false) {\n diagnostics.push({\n level: \"warning\",\n message: `Offset region discarded: ${offset.reason}.`,\n });\n }\n\n const rings = offset.ok ? offset.rings : [];\n const region = regionFromRings(section, rings, \"fill-inset\", [\n ...diagnostics,\n {\n level: rings.length > 0 ? \"info\" : \"warning\",\n message: `Inset region by ${margin.toFixed(3)} mm: ${rings.length} region curves remain from ${section.curves.length} source curves.`,\n },\n ]);\n sectionCache.set(key, region);\n return region;\n};\n\nconst coverageIntersectionRings = (\n sections: Section[],\n layerIndex: number,\n base: Region2D,\n direction: -1 | 1,\n solidLayers: number,\n margin: number,\n) => {\n const layerSpan = Math.max(1, Math.round(solidLayers));\n let coverage: Vec2[][] | null = null;\n\n for (let offset = 1; offset <= layerSpan; offset += 1) {\n const neighbor = sections[layerIndex + direction * offset];\n if (!neighbor) return [];\n\n const neighborRegion = getFillInsetRegion(neighbor, margin);\n const neighborRings = projectRegionRingsToFrame(base, neighborRegion);\n if (neighborRings.length === 0) return [];\n\n coverage = coverage === null ? unionRings2(neighborRings) : booleanRings2(coverage, neighborRings, \"intersection\");\n if (coverage.length === 0) return [];\n }\n\n return coverage ?? [];\n};\n\nconst solidFillRegionsFromRegion = (\n sections: Section[],\n layerIndex: number,\n fillRegion: Region2D,\n solidLayers: number,\n margin: number,\n) => {\n const fillRings = fillRegion.rings;\n const lowerCoverage = coverageIntersectionRings(sections, layerIndex, fillRegion, -1, solidLayers, margin);\n const upperCoverage = coverageIntersectionRings(sections, layerIndex, fillRegion, 1, solidLayers, margin);\n const bottomRings = booleanRings2(fillRings, lowerCoverage, \"difference\");\n const topCandidateRings = booleanRings2(fillRings, upperCoverage, \"difference\");\n const topRings = booleanRings2(topCandidateRings, bottomRings, \"difference\");\n const sparseSolidRings = unionRings2([...bottomRings, ...topRings]);\n const sparseRings = booleanRings2(fillRings, sparseSolidRings, \"difference\");\n\n return {\n bottom: regionFromRings(fillRegion, bottomRings, \"bottom-region\"),\n sparse: regionFromRings(fillRegion, sparseRings, \"sparse-region\"),\n top: regionFromRings(fillRegion, topRings, \"top-region\"),\n };\n};\n\nconst getSolidFillRegionsFromRegion = (\n sections: Section[],\n layerIndex: number,\n fillRegion: Region2D,\n solidLayers: number,\n margin: number,\n) => {\n let sectionCache = solidRegionCache.get(fillRegion);\n if (!sectionCache) {\n sectionCache = new Map();\n solidRegionCache.set(fillRegion, sectionCache);\n }\n\n const key = `${layerIndex}:${Math.max(1, Math.round(solidLayers))}`;\n const cached = sectionCache.get(key);\n if (cached) return cached;\n\n const regions = solidFillRegionsFromRegion(sections, layerIndex, fillRegion, solidLayers, margin);\n sectionCache.set(key, regions);\n return regions;\n};\n\nconst lineFillPaths = (\n section: Section,\n options: LineFillOptions,\n clipRegion: Region2D,\n): ToolpathPath[] => segmentsToSeparatePaths(section, options, lineFillSegments(section, options, clipRegion));\n\nconst lineFillSegments = (\n section: Section,\n options: LineFillOptions,\n clipRegion: Region2D,\n): Segment2[] => lineFillScanSegments(section, options, clipRegion);\n\nconst lineFillScanSegments = (\n section: Section,\n options: LineFillOptions,\n clipRegion: Region2D,\n): ScanSegment2[] => {\n const spacing = options.spacing ?? spacingFromDensity(options.density ?? 0.18, options.lineWidth);\n if (!Number.isFinite(spacing) || spacing <= 0) return [];\n\n const radians = ((options.angle ?? 0) * Math.PI) / 180;\n const bounds = rotatedBoundsForRings(clipRegion.rings, radians);\n const minX = bounds.min[0] - options.lineWidth;\n const maxX = bounds.max[0] + options.lineWidth;\n const polygons = clipRegion.rings;\n const anchorY = scanAnchorY(section, options.field, radians);\n const scanSegments = scanLinePositions(bounds.min[1], bounds.max[1], spacing, anchorY, options.field?.phase ?? 0).map((y) => ({\n start: unrotate([minX, y], radians),\n end: unrotate([maxX, y], radians),\n }));\n\n return scanSegments.flatMap((segment, scanIndex) =>\n clipSegmentsToPolygons([segment], polygons, () => true, {\n minLength: Math.max(options.lineWidth * 0.25, 0.001),\n }).map((clipped) => ({\n ...clipped,\n scanIndex,\n })),\n );\n};\n\nconst roleFlow = (options: LineFillOptions) =>\n options.lineWidth * options.layerHeight * (options.role && options.role !== \"infill\" ? 0.42 : 0.35);\n\nconst roleSpeed = (options: LineFillOptions) => (options.role && options.role !== \"infill\" ? 2600 : 3200);\n\nconst pathFromPoints = (\n section: Section,\n options: LineFillOptions,\n points: readonly Vec2[],\n index: number,\n pattern?: string,\n preserveOrder = false,\n): ToolpathPath => ({\n id: `${options.idPrefix ?? `layer-${options.layerIndex}-${options.role ?? \"infill\"}${pattern ? `-${pattern}` : \"\"}`}-${index}`,\n role: options.role ?? \"infill\",\n order: preserveOrder ? index : undefined,\n layerIndex: options.layerIndex,\n z: section.frame.origin[2],\n closed: false,\n points: points.map(([x, y]) => ({ x, y, z: 0 })),\n extrusion: {\n width: options.lineWidth,\n height: options.layerHeight,\n flow: roleFlow(options),\n },\n speed: roleSpeed(options),\n});\n\nconst segmentsToSeparatePaths = (section: Section, options: LineFillOptions, segments: readonly Segment2[], pattern?: string) =>\n segments.map((segment, index) => pathFromPoints(section, options, [segment.start, segment.end], index, pattern));\n\nconst scanDirection = (angle: number) => {\n const radians = (angle * Math.PI) / 180;\n return [Math.cos(radians), Math.sin(radians)] as const;\n};\n\nconst pointT = (point: Vec2, direction: readonly [number, number]) => point[0] * direction[0] + point[1] * direction[1];\n\nconst groupedScanSegments = (segments: readonly ScanSegment2[], angle: number) => {\n const direction = scanDirection(angle);\n const projected = segments.map((segment) => {\n const startT = pointT(segment.start, direction);\n const endT = pointT(segment.end, direction);\n return { endT, scanIndex: segment.scanIndex, segment, startT };\n }).sort((a, b) => a.scanIndex - b.scanIndex || Math.min(a.startT, a.endT) - Math.min(b.startT, b.endT));\n\n const groups: typeof projected[] = [];\n\n for (const item of projected) {\n const group = groups[groups.length - 1];\n if (group && group[0].scanIndex === item.scanIndex) {\n group.push(item);\n } else {\n groups.push([item]);\n }\n }\n\n return groups.map((group) => [...group].sort((a, b) => Math.min(a.startT, a.endT) - Math.min(b.startT, b.endT)));\n};\n\nconst orientSegmentFromEndpoint = (segment: Segment2, startAtEnd: boolean): Segment2 =>\n startAtEnd ? { start: segment.end, end: segment.start } : { start: segment.start, end: segment.end };\n\nconst orderedMonotonicSegments = (segments: readonly ScanSegment2[], angle: number) => {\n const direction = scanDirection(angle);\n const ordered: Segment2[] = [];\n let currentEnd: Vec2 | undefined;\n\n for (const group of groupedScanSegments(segments, angle)) {\n const remaining = [...group];\n\n while (remaining.length > 0) {\n let bestIndex = 0;\n let bestStartAtEnd = false;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (let index = 0; index < remaining.length; index += 1) {\n const { segment } = remaining[index];\n const candidates = currentEnd\n ? [\n { distance: distance2(currentEnd, segment.start), startAtEnd: false },\n { distance: distance2(currentEnd, segment.end), startAtEnd: true },\n ]\n : [\n { distance: pointT(segment.start, direction), startAtEnd: false },\n { distance: pointT(segment.end, direction), startAtEnd: true },\n ];\n const bestCandidate = candidates[0].distance <= candidates[1].distance ? candidates[0] : candidates[1];\n\n if (bestCandidate.distance < bestDistance) {\n bestDistance = bestCandidate.distance;\n bestIndex = index;\n bestStartAtEnd = bestCandidate.startAtEnd;\n }\n }\n\n const [next] = remaining.splice(bestIndex, 1);\n const oriented = orientSegmentFromEndpoint(next.segment, bestStartAtEnd);\n ordered.push(oriented);\n currentEnd = oriented.end;\n }\n }\n\n return ordered;\n};\n\nconst monotonicLineFillPaths = (\n section: Section,\n options: LineFillOptions,\n clipRegion: Region2D,\n): ToolpathPath[] =>\n orderedMonotonicSegments(lineFillScanSegments(section, options, clipRegion), options.angle ?? 0)\n .map((segment, index) => pathFromPoints(section, options, [segment.start, segment.end], index, \"monotonic-line\", true));\n\nconst monotonicFillPaths = (\n section: Section,\n options: LineFillOptions,\n clipRegion: Region2D,\n): ToolpathPath[] => {\n const spacing = options.spacing ?? spacingFromDensity(options.density ?? 0.18, options.lineWidth);\n const connectorLimit = (Number.isFinite(spacing) ? spacing : options.lineWidth) * 2.5 + options.lineWidth;\n const segments = orderedMonotonicSegments(lineFillScanSegments(section, options, clipRegion), options.angle ?? 0);\n const paths: ToolpathPath[] = [];\n let current: Vec2[] = [];\n\n const flush = () => {\n if (current.length >= 2) {\n paths.push(pathFromPoints(section, options, current, paths.length, \"monotonic\", true));\n }\n current = [];\n };\n\n for (const segment of segments) {\n if (current.length === 0) {\n current = [segment.start, segment.end];\n continue;\n }\n\n const previousEnd = current[current.length - 1];\n if (distance2(previousEnd, segment.start) <= connectorLimit && connectorStaysInsideRegion(previousEnd, segment.start, clipRegion.rings)) {\n if (!samePoint2(previousEnd, segment.start)) current.push(segment.start);\n current.push(segment.end);\n } else {\n flush();\n current = [segment.start, segment.end];\n }\n }\n\n flush();\n return paths;\n};\n\nconst concentricFillPaths = (\n section: Section,\n options: LineFillOptions,\n clipRegion: Region2D,\n): ToolpathPath[] => {\n const spacing = options.spacing ?? spacingFromDensity(options.density ?? 0.18, options.lineWidth);\n if (!Number.isFinite(spacing) || spacing <= 0) return [];\n\n const paths: ToolpathPath[] = [];\n let current = clipRegion.rings;\n let pass = 0;\n const maxPasses = 1000;\n\n while (current.length > 0 && pass < maxPasses) {\n for (const ring of current) {\n if (ring.length < 3) continue;\n paths.push({\n id: `${options.idPrefix ?? `layer-${options.layerIndex}-${options.role ?? \"infill\"}-concentric`}-${pass}-${paths.length}`,\n role: options.role ?? \"infill\",\n layerIndex: options.layerIndex,\n z: section.frame.origin[2],\n closed: true,\n points: ring.map(([x, y]) => ({ x, y, z: 0 })),\n extrusion: {\n width: options.lineWidth,\n height: options.layerHeight,\n flow: options.lineWidth * options.layerHeight * (options.role && options.role !== \"infill\" ? 0.42 : 0.35),\n },\n speed: options.role && options.role !== \"infill\" ? 2600 : 3200,\n });\n }\n\n const offset = offsetRegionRings2(\n regionRingsWithRoles(section, current),\n spacing,\n );\n current = offset.ok ? offset.rings : [];\n pass += 1;\n }\n\n return paths;\n};\n\nconst patternFillPaths = (\n section: Section,\n options: LineFillOptions & { pattern?: InfillPattern },\n clipRegion: Region2D,\n): ToolpathPath[] => {\n const pattern = options.pattern\n ?? (options.role === \"bottom\"\n ? \"monotonic\"\n : options.role === \"solidInfill\" || options.role === \"top\"\n ? \"monotonicLine\"\n : \"rectilinear\");\n if (pattern === \"concentric\") return concentricFillPaths(section, options, clipRegion);\n if (pattern === \"monotonic\") return monotonicFillPaths(section, options, clipRegion);\n if (pattern === \"monotonicLine\") return monotonicLineFillPaths(section, options, clipRegion);\n\n const baseAngle = options.angle ?? (pattern === \"rectilinear\" ? 45 : 0);\n if (pattern === \"rectilinear\") {\n return monotonicFillPaths(section, {\n ...options,\n angle: baseAngle + (options.layerIndex % 2 === 0 ? 0 : 90),\n }, clipRegion);\n }\n\n const angleOffsets = pattern === \"grid\" ? [0, 90] : pattern === \"triangles\" ? [0, 60, 120] : [0];\n const spacing = options.spacing ?? spacingFromDensity(options.density ?? 0.18, options.lineWidth);\n if (!Number.isFinite(spacing) || spacing <= 0) return [];\n\n return angleOffsets.flatMap((angleOffset, index) =>\n lineFillPaths(\n section,\n {\n ...options,\n angle: baseAngle + angleOffset,\n idPrefix: `${options.idPrefix ?? `layer-${options.layerIndex}-${options.role ?? \"infill\"}-${pattern}`}-${index}`,\n spacing,\n },\n clipRegion,\n ),\n );\n};\n\nconst isPathRegionBuilder = (target: unknown): target is { toRegion: () => Region2D } =>\n typeof target === \"object\" && target !== null && \"toRegion\" in target && typeof (target as { toRegion?: unknown }).toRegion === \"function\";\n\nconst isRegion2D = (target: unknown): target is Region2D =>\n typeof target === \"object\" && target !== null && \"rings\" in target && \"source\" in target && \"frame\" in target;\n\nconst regionTarget = (target: Section | Region2D | { section: Section } | { toRegion: () => Region2D }) => {\n if (isPathRegionBuilder(target)) return target.toRegion();\n if (isRegion2D(target)) return target;\n if (\"section\" in target) return regionFromSection(target.section, \"fill-region\");\n return regionFromSection(target, \"fill-region\");\n};\n\nexport const fillRegionPaths = (\n target: FillRegionTarget,\n options: FillRegionOptions,\n): ToolpathPath[] => {\n const clipRegion = regionTarget(target);\n return patternFillPaths(\n clipRegion.source,\n {\n angle: options.angle,\n density: options.density ?? 1,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex: options.layerIndex ?? 0,\n lineWidth: options.lineWidth ?? 0.44,\n pattern: options.pattern,\n role: options.role ?? \"infill\",\n spacing: options.spacing,\n },\n clipRegion,\n );\n};\n\nconst reportRegionWarnings = (region: Region2D, onDiagnostic?: DiagnosticReporter) => {\n if (!onDiagnostic) return;\n\n for (const diagnostic of region.diagnostics) {\n onDiagnostic(diagnostic.message, diagnostic.level);\n }\n};\n\nexport const lineInfillPaths = (section: Section, options: LineFillOptions): ToolpathPath[] => {\n const sectionRegion = getFillInsetRegion(section, options.margin ?? 0);\n reportRegionWarnings(sectionRegion, options.onDiagnostic);\n return patternFillPaths(section, options, sectionRegion);\n};\n\nexport const fillRegionLayerPaths = (\n targets: readonly FillRegionTarget[],\n layerIndex: number,\n options: FillLayerOptions,\n): FillLayerResult => {\n const sections = targets.map((target, index) => sectionFromRegion(regionTarget(target), `region-layer-${index}`));\n return fillLayerPaths(sections, layerIndex, options);\n};\n\nexport const sparseInfillPaths = (\n sections: Section[],\n layerIndex: number,\n options: LineFillOptions & { solidLayers?: number },\n): ToolpathPath[] => {\n const section = sections[layerIndex];\n if (!section) return [];\n const solidLayers = options.solidLayers ?? 3;\n const margin = options.margin ?? 0;\n const sectionRegion = getFillInsetRegion(section, margin);\n reportRegionWarnings(sectionRegion, options.onDiagnostic);\n const regions = getSolidFillRegionsFromRegion(sections, layerIndex, sectionRegion, solidLayers, margin);\n\n return patternFillPaths(section, options, regions.sparse);\n};\n\nexport const fillLayerPaths = (\n sections: Section[],\n layerIndex: number,\n options: FillLayerOptions,\n): FillLayerResult => {\n const section = sections[layerIndex];\n if (!section) {\n throw new Error(`fillLayer layerIndex is out of range: ${layerIndex}`);\n }\n\n const solidLayers = options.solidLayers ?? 3;\n const pathLayerIndex = options.layerIndex ?? layerIndex;\n const margin = options.margin ?? 0;\n const sectionRegion = getFillInsetRegion(section, margin);\n reportRegionWarnings(sectionRegion, options.onDiagnostic);\n const regions = getSolidFillRegionsFromRegion(sections, layerIndex, sectionRegion, solidLayers, margin);\n const bottom = patternFillPaths(\n section,\n {\n angle: options.bottomAngle ?? 45,\n field: options.field,\n layerHeight: options.layerHeight,\n layerIndex: pathLayerIndex,\n lineWidth: options.lineWidth,\n margin: options.margin,\n role: \"bottom\",\n spacing: options.lineWidth,\n pattern: options.bottomPattern ?? options.pattern,\n },\n regions.bottom,\n );\n const top = patternFillPaths(\n section,\n {\n angle: options.topAngle ?? -45,\n field: options.field,\n layerHeight: options.layerHeight,\n layerIndex: pathLayerIndex,\n lineWidth: options.lineWidth,\n margin: options.margin,\n role: \"top\",\n spacing: options.lineWidth,\n pattern: options.topPattern ?? options.pattern,\n },\n regions.top,\n );\n const sparse = patternFillPaths(\n section,\n {\n angle: options.sparseAngle,\n density: options.density ?? 0.18,\n field: options.field,\n layerHeight: options.layerHeight,\n layerIndex: pathLayerIndex,\n lineWidth: options.lineWidth,\n margin: options.margin,\n role: \"infill\",\n pattern: options.sparsePattern ?? options.pattern,\n spacing: options.sparseSpacing,\n },\n regions.sparse,\n );\n\n return {\n bottom,\n get paths() {\n return [...bottom, ...top, ...sparse];\n },\n regions: lazyRegionSections(regions, sectionRegion),\n sparse,\n top,\n };\n};\n\nexport const bottomSolidFillPaths = (\n sections: Section[],\n layerIndex: number,\n options: SolidFillOptions,\n): ToolpathPath[] => {\n const section = sections[layerIndex];\n if (!section) return [];\n const solidLayers = options.solidLayers ?? 3;\n const margin = options.margin ?? 0;\n const sectionRegion = getFillInsetRegion(section, margin);\n reportRegionWarnings(sectionRegion, options.onDiagnostic);\n const regions = getSolidFillRegionsFromRegion(sections, layerIndex, sectionRegion, solidLayers, margin);\n\n return patternFillPaths(\n section,\n {\n angle: options.angle ?? 45,\n field: options.field,\n layerHeight: options.layerHeight,\n layerIndex: options.layerIndex ?? layerIndex,\n lineWidth: options.lineWidth,\n margin: options.margin,\n pattern: options.pattern,\n role: \"bottom\",\n spacing: options.lineWidth,\n },\n regions.bottom,\n );\n};\n\nexport const topSolidFillPaths = (\n sections: Section[],\n layerIndex: number,\n options: SolidFillOptions,\n): ToolpathPath[] => {\n const section = sections[layerIndex];\n if (!section) return [];\n const solidLayers = options.solidLayers ?? 3;\n const margin = options.margin ?? 0;\n const sectionRegion = getFillInsetRegion(section, margin);\n reportRegionWarnings(sectionRegion, options.onDiagnostic);\n const regions = getSolidFillRegionsFromRegion(sections, layerIndex, sectionRegion, solidLayers, margin);\n\n return patternFillPaths(\n section,\n {\n angle: options.angle ?? -45,\n field: options.field,\n layerHeight: options.layerHeight,\n layerIndex: options.layerIndex ?? layerIndex,\n lineWidth: options.lineWidth,\n margin: options.margin,\n pattern: options.pattern,\n role: \"top\",\n spacing: options.lineWidth,\n },\n regions.top,\n );\n};\n", "import type { PathInput } from \"./modifiers\";\nimport type { ToolpathPath, ToolpathPoint, ToolpathRole } from \"./types\";\n\nexport type LayerPlanningOptions = {\n roleOrder?: ToolpathRole[];\n travel?: boolean;\n travelSpeed?: number;\n};\n\nconst defaultRoleOrder: ToolpathRole[] = [\"outerWall\", \"innerWall\", \"bottom\", \"top\", \"solidInfill\", \"infill\", \"support\"];\n\nconst flattenPaths = (paths: PathInput): ToolpathPath[] =>\n Array.isArray(paths) ? paths.flatMap((path) => flattenPaths(path)) : [paths];\n\nconst firstPoint = (path: ToolpathPath) => path.points[0];\n\nconst lastPoint = (path: ToolpathPath) => (path.closed ? path.points[0] : path.points[path.points.length - 1]);\n\nconst distanceSquared = (a: ToolpathPoint, b: ToolpathPoint) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dz = b.z - a.z;\n return dx * dx + dy * dy + dz * dz;\n};\n\nconst orderedRoles = (paths: ToolpathPath[], roleOrder: ToolpathRole[]) => {\n const roles = new Set(paths.map((path) => path.role));\n const ordered = roleOrder.filter((role) => roles.has(role));\n\n for (const path of paths) {\n if (!ordered.includes(path.role)) ordered.push(path.role);\n }\n\n return ordered;\n};\n\nconst pickNearestPath = (paths: ToolpathPath[], currentPoint?: ToolpathPoint) => {\n if (!currentPoint) return paths.shift();\n\n let bestIndex = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (let index = 0; index < paths.length; index += 1) {\n const start = firstPoint(paths[index]);\n if (!start) continue;\n\n const distance = distanceSquared(currentPoint, start);\n if (distance < bestDistance) {\n bestDistance = distance;\n bestIndex = index;\n }\n }\n\n return paths.splice(bestIndex, 1)[0];\n};\n\nconst hasOrderedPaths = (paths: ToolpathPath[]) => paths.some((path) => Number.isFinite(path.order));\n\nconst reversedPath = (path: ToolpathPath): ToolpathPath => ({\n ...path,\n points: [...path.points].reverse(),\n});\n\nconst orderedPathSequence = (paths: ToolpathPath[], currentPoint?: ToolpathPoint) => {\n const sorted = [...paths].sort((a, b) => {\n const orderA = Number.isFinite(a.order) ? a.order as number : Number.POSITIVE_INFINITY;\n const orderB = Number.isFinite(b.order) ? b.order as number : Number.POSITIVE_INFINITY;\n return orderA - orderB;\n });\n\n if (!currentPoint || sorted.length === 0) return sorted;\n\n const reversed = sorted.map(reversedPath).reverse();\n const forwardStart = firstPoint(sorted[0]);\n const reverseStart = firstPoint(reversed[0]);\n if (!forwardStart || !reverseStart) return sorted;\n\n return distanceSquared(currentPoint, reverseStart) < distanceSquared(currentPoint, forwardStart) ? reversed : sorted;\n};\n\nconst appendPathWithTravel = (\n planned: ToolpathPath[],\n path: ToolpathPath,\n currentPoint: ToolpathPoint | undefined,\n travelIndex: number,\n shouldInsertTravel: boolean,\n travelSpeed: number,\n) => {\n const start = firstPoint(path);\n let nextTravelIndex = travelIndex;\n if (shouldInsertTravel && currentPoint && start && distanceSquared(currentPoint, start) > 0) {\n planned.push(travelPath(currentPoint, start, nextTravelIndex, travelSpeed));\n nextTravelIndex += 1;\n }\n\n planned.push(path);\n\n return {\n currentPoint: lastPoint(path),\n travelIndex: nextTravelIndex,\n };\n};\n\nconst travelPath = (from: ToolpathPoint, to: ToolpathPoint, index: number, speed: number): ToolpathPath => ({\n id: `layer-0-travel-${index}`,\n role: \"travel\",\n layerIndex: 0,\n z: from.z,\n closed: false,\n points: [{ ...from }, { ...to }],\n speed,\n});\n\nexport const planLayerPaths = (paths: PathInput, options: LayerPlanningOptions = {}): ToolpathPath[] => {\n const sourcePaths = flattenPaths(paths).filter((path) => path.points.length > 0);\n const roleOrder = options.roleOrder ?? defaultRoleOrder;\n const shouldInsertTravel = options.travel ?? true;\n const travelSpeed = options.travelSpeed ?? 7200;\n const planned: ToolpathPath[] = [];\n let currentPoint: ToolpathPoint | undefined;\n let travelIndex = 0;\n\n for (const role of orderedRoles(sourcePaths, roleOrder)) {\n const remaining = sourcePaths.filter((path) => path.role === role);\n const preservePathOrder = hasOrderedPaths(remaining);\n\n if (preservePathOrder) {\n for (const path of orderedPathSequence(remaining, currentPoint)) {\n const result = appendPathWithTravel(planned, path, currentPoint, travelIndex, shouldInsertTravel, travelSpeed);\n currentPoint = result.currentPoint;\n travelIndex = result.travelIndex;\n }\n continue;\n }\n\n while (remaining.length > 0) {\n const path = pickNearestPath(remaining, currentPoint);\n if (!path) break;\n\n const result = appendPathWithTravel(planned, path, currentPoint, travelIndex, shouldInsertTravel, travelSpeed);\n currentPoint = result.currentPoint;\n travelIndex = result.travelIndex;\n }\n }\n\n return planned;\n};\n", "import type { Vec2 } from \"../geometry/types\";\nimport { fillRegionLayerPaths, fillRegionPaths, pathRegion, type InfillPattern } from \"./infill\";\nimport { planLayerPaths } from \"./planning\";\nimport type { ToolpathPath } from \"./types\";\n\nexport type ToolpathValidationIssue = {\n level: \"error\" | \"warning\";\n message: string;\n};\n\nconst outer: Vec2[] = [\n [0, 0],\n [20, 0],\n [20, 10],\n [0, 10],\n];\n\nconst holeCcw: Vec2[] = [\n [6, 3],\n [14, 3],\n [14, 7],\n [6, 7],\n];\n\nconst holeCw = [...holeCcw].reverse();\n\nconst fail = (condition: boolean, message: string): ToolpathValidationIssue[] =>\n condition ? [] : [{ level: \"error\", message }];\n\nconst insideHole = (point: { x: number; y: number }) =>\n point.x > 6.001 && point.x < 13.999 && point.y > 3.001 && point.y < 6.999;\n\nconst hasPointInsideHole = (path: ToolpathPath) => {\n if (path.points.length < 2) return false;\n\n const segmentCount = path.closed ? path.points.length : path.points.length - 1;\n for (let segmentIndex = 0; segmentIndex < segmentCount; segmentIndex += 1) {\n const start = path.points[segmentIndex];\n const end = path.points[(segmentIndex + 1) % path.points.length];\n\n for (let index = 1; index < 10; index += 1) {\n const t = index / 10;\n const point = {\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n };\n if (insideHole(point)) return true;\n }\n }\n\n return false;\n};\n\nconst yLineCount = (paths: ToolpathPath[], y: number) =>\n paths.filter((path) => path.points.length >= 2 && path.points.every((point) => Math.abs(point.y - y) < 1e-6)).length;\n\nconst validateHoleFill = (name: string, createRegion: () => ReturnType<typeof pathRegion>) => {\n const issues: ToolpathValidationIssue[] = [];\n const patterns: InfillPattern[] = [\"lines\", \"rectilinear\", \"monotonicLine\", \"monotonic\", \"grid\", \"triangles\", \"concentric\"];\n\n for (const pattern of patterns) {\n const paths = fillRegionPaths(createRegion(), {\n field: { anchor: \"build\", origin: [0, 0, 0] },\n layerHeight: 0.2,\n lineWidth: 0.4,\n pattern,\n spacing: 1,\n });\n\n issues.push(...fail(paths.length > 0, `${name}: expected ${pattern} fill paths.`));\n issues.push(...fail(!paths.some(hasPointInsideHole), `${name}: expected ${pattern} fill to avoid the hole.`));\n\n if (pattern === \"lines\") {\n issues.push(...fail(yLineCount(paths, 5) === 2, `${name}: expected line fill through the hole to split into two segments.`));\n }\n }\n\n return issues;\n};\n\nconst validateMonotonicFill = () => {\n const region = pathRegion(0).polygon(outer);\n const monotonic = fillRegionPaths(region, {\n layerHeight: 0.2,\n lineWidth: 0.4,\n pattern: \"monotonic\",\n role: \"bottom\",\n spacing: 1,\n });\n const monotonicLine = fillRegionPaths(region, {\n layerHeight: 0.2,\n lineWidth: 0.4,\n pattern: \"monotonicLine\",\n role: \"bottom\",\n spacing: 1,\n });\n const plannedMonotonicLine = planLayerPaths([monotonicLine], {\n roleOrder: [\"bottom\"],\n travel: false,\n });\n const plannedMonotonic = planLayerPaths([monotonic], {\n roleOrder: [\"bottom\"],\n travel: false,\n });\n const lastMonotonicLine = monotonicLine[monotonicLine.length - 1];\n const lastPoint = lastMonotonicLine?.points[lastMonotonicLine.points.length - 1];\n const plannedFromOppositeCorner = lastPoint\n ? planLayerPaths([{\n id: \"seed-inner-wall\",\n role: \"innerWall\",\n layerIndex: 0,\n z: 0,\n closed: false,\n points: [\n { x: -100, y: -100, z: 0 },\n { ...lastPoint },\n ],\n speed: 1200,\n } satisfies ToolpathPath, monotonicLine], {\n roleOrder: [\"innerWall\", \"bottom\"],\n travel: false,\n }).filter((path) => path.role === \"bottom\")\n : [];\n\n return [\n ...fail(monotonic.length === 1, \"Monotonic bottom fill should connect a simple solid region into one stroke.\"),\n ...fail(\n monotonic.every((path, index) => plannedMonotonic[index]?.id === path.id),\n \"Monotonic bottom fill planning should preserve scanline path order.\",\n ),\n ...fail(\n monotonic.length !== 1\n || monotonic[0].points.length < 4\n || Math.abs(monotonic[0].points[1].x - monotonic[0].points[2].x) < 1e-6,\n \"Monotonic bottom fill should snake through adjacent scan lines instead of restarting from the opposite side.\",\n ),\n ...fail(monotonicLine.length > monotonic.length, \"Monotonic line fill should keep scan lines as separate strokes.\"),\n ...fail(\n monotonicLine.every((path, index) => plannedMonotonicLine[index]?.id === path.id),\n \"Monotonic line fill planning should preserve corner-to-corner scanline order.\",\n ),\n ...fail(\n plannedFromOppositeCorner[0]?.id === monotonicLine[monotonicLine.length - 1]?.id,\n \"Monotonic line fill planning should be reversible to start from the nearest corner.\",\n ),\n ];\n};\n\nconst validateRectilinearFill = () => {\n const region = pathRegion(0).polygon(outer);\n const firstLayer = fillRegionPaths(region, {\n angle: 45,\n layerHeight: 0.2,\n layerIndex: 0,\n lineWidth: 0.4,\n pattern: \"rectilinear\",\n role: \"infill\",\n spacing: 1,\n });\n const secondLayer = fillRegionPaths(region, {\n angle: 45,\n layerHeight: 0.2,\n layerIndex: 1,\n lineWidth: 0.4,\n pattern: \"rectilinear\",\n role: \"infill\",\n spacing: 1,\n });\n const direction = (path: ToolpathPath) => {\n const first = path.points[0];\n const second = path.points[1];\n return Math.atan2(second.y - first.y, second.x - first.x);\n };\n\n const hasPaths = firstLayer.length > 0 && secondLayer.length > 0;\n\n return [\n ...fail(hasPaths, \"Rectilinear fill should generate paths on adjacent layers.\"),\n ...fail(!hasPaths || Math.abs(Math.sin(direction(firstLayer[0]) - direction(secondLayer[0]))) > 0.9, \"Rectilinear fill should rotate 90 degrees across adjacent layers.\"),\n ];\n};\n\nexport const validateToolpathSmokeFixtures = (): ToolpathValidationIssue[] => [\n ...validateHoleFill(\"Direct path .hole() is winding-independent\", () =>\n pathRegion(0).polygon(outer).hole(holeCcw),\n ),\n ...validateHoleFill(\"Direct path reversed .hole() is winding-independent\", () =>\n pathRegion(0).polygon(outer).hole(holeCw),\n ),\n ...validateHoleFill(\"Direct path { hole: true } is winding-independent\", () =>\n pathRegion(0).polygon(outer).polygon(holeCcw, { hole: true }),\n ),\n ...validateHoleFill(\"Direct path reversed { hole: true } is winding-independent\", () =>\n pathRegion(0).polygon(outer).polygon(holeCw, { hole: true }),\n ),\n ...validateHoleFill(\"Direct path nested rings classify implicit holes\", () =>\n pathRegion(0).polygon(outer).polygon(holeCcw),\n ),\n ...validateMonotonicFill(),\n ...validateRectilinearFill(),\n ...(() => {\n const regions = Array.from({ length: 7 }, (_value, layerIndex) =>\n pathRegion(layerIndex * 0.2).polygon(outer),\n );\n const bottom = fillRegionLayerPaths(regions, 0, {\n layerHeight: 0.2,\n lineWidth: 0.4,\n solidLayers: 2,\n });\n const sparse = fillRegionLayerPaths(regions, 3, {\n density: 0.2,\n layerHeight: 0.2,\n lineWidth: 0.4,\n solidLayers: 2,\n });\n const top = fillRegionLayerPaths(regions, 6, {\n layerHeight: 0.2,\n lineWidth: 0.4,\n solidLayers: 2,\n });\n\n return [\n ...fail(bottom.bottom.length > 0 && bottom.top.length === 0, \"Direct path region layer fill should classify bottom solid layers.\"),\n ...fail(sparse.sparse.length > 0 && sparse.bottom.length === 0 && sparse.top.length === 0, \"Direct path region layer fill should classify sparse infill layers.\"),\n ...fail(top.top.length > 0 && top.bottom.length === 0, \"Direct path region layer fill should classify top solid layers.\"),\n ];\n })(),\n];\n", "import type { ToolpathPath, ToolpathPoint } from \"./types\";\n\nexport type PathInput = ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]>;\n\nexport type PathModifier = (path: ToolpathPath) => ToolpathPath;\n\ntype ResampleOptions = {\n spacing: number;\n};\n\ntype WaveOptions = {\n amplitude: number;\n wavelength: number;\n};\n\ntype NoiseOptions = {\n amplitude: number;\n frequency?: number;\n seed?: number;\n};\n\nconst flattenPaths = (paths: PathInput): ToolpathPath[] =>\n Array.isArray(paths) ? paths.flatMap((path) => flattenPaths(path)) : [paths];\n\nconst clonePath = (path: ToolpathPath, points = path.points): ToolpathPath => ({\n ...path,\n points: points.map((point) => ({ ...point })),\n});\n\nconst distance = (a: ToolpathPoint, b: ToolpathPoint) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dz = b.z - a.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n};\n\nconst lerpPoint = (a: ToolpathPoint, b: ToolpathPoint, t: number): ToolpathPoint => ({\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n z: a.z + (b.z - a.z) * t,\n});\n\nconst pathSegments = (path: ToolpathPath) => {\n const points = path.closed ? [...path.points, path.points[0]] : path.points;\n const segments: Array<[ToolpathPoint, ToolpathPoint]> = [];\n\n for (let index = 1; index < points.length; index += 1) {\n segments.push([points[index - 1], points[index]]);\n }\n\n return segments;\n};\n\nconst tangentAt = (points: ToolpathPoint[], index: number) => {\n const previous = points[Math.max(0, index - 1)] ?? points[index];\n const next = points[Math.min(points.length - 1, index + 1)] ?? points[index];\n const dx = next.x - previous.x;\n const dy = next.y - previous.y;\n const length = Math.hypot(dx, dy) || 1;\n\n return {\n x: dx / length,\n y: dy / length,\n };\n};\n\nconst normalAt = (points: ToolpathPoint[], index: number) => {\n const tangent = tangentAt(points, index);\n return {\n x: -tangent.y,\n y: tangent.x,\n };\n};\n\nconst withPointOffsets = (path: ToolpathPath, offsetAt: (distanceAlongPath: number, index: number) => number) => {\n let distanceAlongPath = 0;\n const points = path.points.map((point, index, points) => {\n if (index > 0) {\n distanceAlongPath += distance(points[index - 1], point);\n }\n\n const normal = normalAt(points, index);\n const offset = offsetAt(distanceAlongPath, index);\n\n return {\n ...point,\n x: point.x + normal.x * offset,\n y: point.y + normal.y * offset,\n };\n });\n\n return clonePath(path, points);\n};\n\nconst random = (seed: number) => {\n let state = seed >>> 0;\n return () => {\n state = (1664525 * state + 1013904223) >>> 0;\n return state / 0xffffffff;\n };\n};\n\nexport const resample = ({ spacing }: ResampleOptions): PathModifier => {\n const safeSpacing = Math.max(0.001, spacing);\n\n return (path) => {\n if (path.points.length < 2) return clonePath(path);\n\n const points: ToolpathPoint[] = [];\n\n for (const [start, end] of pathSegments(path)) {\n const length = distance(start, end);\n const steps = Math.max(1, Math.ceil(length / safeSpacing));\n\n if (points.length === 0) points.push({ ...start });\n\n for (let step = 1; step <= steps; step += 1) {\n const t = step / steps;\n points.push(lerpPoint(start, end, t));\n }\n }\n\n if (path.closed) points.pop();\n return clonePath(path, points);\n };\n};\n\nexport const sine = ({ amplitude, wavelength }: WaveOptions): PathModifier => {\n const safeWavelength = Math.max(0.001, wavelength);\n\n return (path) =>\n withPointOffsets(path, (distanceAlongPath) => amplitude * Math.sin((distanceAlongPath / safeWavelength) * Math.PI * 2));\n};\n\nexport const zigzag = ({ amplitude, wavelength }: WaveOptions): PathModifier => {\n const safeWavelength = Math.max(0.001, wavelength);\n\n return (path) =>\n withPointOffsets(path, (distanceAlongPath) => {\n const phase = (distanceAlongPath / safeWavelength) % 1;\n const triangle = phase < 0.5 ? phase * 4 - 1 : 3 - phase * 4;\n return amplitude * triangle;\n });\n};\n\nexport const noise = ({ amplitude, frequency = 1, seed = 1 }: NoiseOptions): PathModifier => {\n const nextRandom = random(seed);\n\n return (path) => {\n const values = path.points.map(() => (nextRandom() * 2 - 1) * amplitude);\n\n return withPointOffsets(path, (distanceAlongPath, index) => {\n const wave = Math.sin(distanceAlongPath * frequency);\n return values[index] * wave;\n });\n };\n};\n\nexport const modifyPaths = (paths: PathInput, modifiers: PathModifier | PathModifier[]): ToolpathPath[] => {\n const modifierList = Array.isArray(modifiers) ? modifiers : [modifiers];\n\n return flattenPaths(paths).map((path) => modifierList.reduce((current, modifier) => modifier(current), path));\n};\n", "import type { Vec2 } from \"../geometry/types\";\nimport { clipSegmentsToPolygons } from \"../geometry/kernel/lineClip\";\nimport { offsetClosedRing2MultiResult, type OffsetOptions } from \"../geometry/kernel/offset\";\nimport type { Section } from \"../section/types\";\nimport type { SectionRegion } from \"../section/region\";\nimport { modifyPaths, type PathModifier } from \"./modifiers\";\nimport type { ToolpathPath, ToolpathPoint, ToolpathPrimitive, ToolpathRole } from \"./types\";\n\ntype PointInput =\n | readonly [number, number]\n | readonly [number, number, number]\n | {\n x: number;\n y: number;\n z?: number;\n };\n\ntype PathLayerOptions = {\n layerHeight?: number;\n layerIndex?: number;\n lineWidth?: number;\n speed?: number;\n};\n\ntype PathOptions = {\n closed?: boolean;\n extrude?: boolean;\n flow?: number;\n height?: number;\n id?: string;\n primitive?: ToolpathPrimitive;\n speed?: number;\n width?: number;\n};\n\ntype CircleOptions = PathOptions & {\n segments?: number;\n};\n\ntype RingClipTarget = {\n rings: readonly (readonly Vec2[])[];\n};\n\ntype ClipTarget = Section | SectionRegion | RingClipTarget | { toRegion: () => RingClipTarget };\n\ntype ClipOptions = {\n minLength?: number;\n role?: ToolpathRole;\n};\n\nconst EXTRUSION_ROLES = new Set<ToolpathRole>([\n \"outerWall\",\n \"innerWall\",\n \"infill\",\n \"solidInfill\",\n \"top\",\n \"bottom\",\n \"support\",\n]);\n\nconst DEFAULT_SPEED_BY_ROLE: Record<ToolpathRole, number> = {\n bottom: 2400,\n infill: 3200,\n innerWall: 2200,\n outerWall: 1800,\n solidInfill: 2600,\n support: 2600,\n top: 2400,\n travel: 5000,\n};\n\nconst isSectionRegion = (target: ClipTarget): target is SectionRegion => \"section\" in target && \"contains\" in target;\n\nconst isRegionBuilder = (target: ClipTarget): target is { toRegion: () => RingClipTarget } =>\n \"toRegion\" in target && typeof target.toRegion === \"function\";\n\nconst isRingClipTarget = (target: ClipTarget): target is RingClipTarget => \"rings\" in target;\n\nconst clipPolygons = (target: ClipTarget) => {\n const resolved = isRegionBuilder(target) ? target.toRegion() : target;\n if (isRingClipTarget(resolved)) return resolved.rings.map((ring) => [...ring]);\n\n const section = isSectionRegion(resolved) ? resolved.section : resolved;\n return section.curves.flatMap((curve): Vec2[][] => {\n if (curve.role === \"invalid\" || curve.role === \"open\" || curve.points2.length < 3) return [];\n return [curve.points2];\n });\n};\n\nconst pointFromInput = (input: PointInput, z: number): ToolpathPoint => {\n if (\"x\" in input) {\n return {\n x: Number(input.x),\n y: Number(input.y),\n z: Number(input.z ?? z),\n };\n }\n\n return {\n x: Number(input[0]),\n y: Number(input[1]),\n z: Number(input[2] ?? z),\n };\n};\n\nconst pathSegments = (path: ToolpathPath) => {\n const points = path.closed ? [...path.points, path.points[0]] : path.points;\n const segments: Array<{ start: Vec2; end: Vec2 }> = [];\n\n for (let index = 1; index < points.length; index += 1) {\n const start = points[index - 1];\n const end = points[index];\n segments.push({\n start: [start.x, start.y],\n end: [end.x, end.y],\n });\n }\n\n return segments;\n};\n\nconst defaultExtrudeForRole = (role: ToolpathRole) => EXTRUSION_ROLES.has(role);\n\nconst defaultFlow = (role: ToolpathRole, width: number, height: number) => {\n const multiplier = role === \"outerWall\" || role === \"innerWall\" ? 0.45 : 0.35;\n return width * height * multiplier;\n};\n\nexport const pathLayer = (z: number, options: PathLayerOptions = {}) => {\n const layerIndex = options.layerIndex ?? 0;\n const layerHeight = options.layerHeight ?? 0.2;\n const lineWidth = options.lineWidth ?? 0.44;\n const paths: ToolpathPath[] = [];\n let pathIndex = 0;\n\n const createPath = (role: ToolpathRole, points: ToolpathPoint[], pathOptions: PathOptions = {}): ToolpathPath => {\n const width = pathOptions.width ?? lineWidth;\n const height = pathOptions.height ?? layerHeight;\n const shouldExtrude = pathOptions.extrude ?? defaultExtrudeForRole(role);\n\n return {\n id: pathOptions.id ?? `custom-${layerIndex}-${pathIndex++}`,\n role,\n primitive: pathOptions.primitive,\n layerIndex,\n z,\n closed: pathOptions.closed ?? false,\n points,\n extrusion: shouldExtrude\n ? {\n width,\n height,\n flow: pathOptions.flow ?? defaultFlow(role, width, height),\n }\n : undefined,\n speed: pathOptions.speed ?? options.speed ?? DEFAULT_SPEED_BY_ROLE[role],\n };\n };\n\n const api = {\n get paths() {\n return paths;\n },\n circle: (role: ToolpathRole, center: PointInput, radius: number, pathOptions: CircleOptions = {}) => {\n const segmentCount = Math.max(8, Math.round(pathOptions.segments ?? 64));\n const centerPoint = pointFromInput(center, z);\n const points = Array.from({ length: segmentCount }, (_value, index) => {\n const angle = (index / segmentCount) * Math.PI * 2;\n return {\n x: centerPoint.x + Math.cos(angle) * radius,\n y: centerPoint.y + Math.sin(angle) * radius,\n z: centerPoint.z,\n };\n });\n\n paths.push(createPath(role, points, { ...pathOptions, closed: true }));\n return api;\n },\n clip: (target: ClipTarget, clipOptions: ClipOptions = {}) => {\n const polygons = clipPolygons(target);\n const containsPoint = isSectionRegion(target) ? target.contains : () => true;\n if (polygons.length === 0) {\n paths.splice(0, paths.length);\n return api;\n }\n\n const clippedPaths = paths.flatMap((path): ToolpathPath[] => {\n const segments = clipSegmentsToPolygons(pathSegments(path), polygons, () => true, {\n minLength: clipOptions.minLength,\n }).filter((segment) => containsPoint([\n (segment.start[0] + segment.end[0]) / 2,\n (segment.start[1] + segment.end[1]) / 2,\n ]));\n\n return segments.map((segment, index) =>\n createPath(\n clipOptions.role ?? path.role,\n [\n { x: segment.start[0], y: segment.start[1], z: path.z },\n { x: segment.end[0], y: segment.end[1], z: path.z },\n ],\n {\n closed: false,\n extrude: Boolean(path.extrusion),\n flow: path.extrusion?.flow,\n height: path.extrusion?.height,\n id: `${path.id}-clip-${index}`,\n primitive: \"segments\",\n speed: path.speed,\n width: path.extrusion?.width,\n },\n ),\n );\n });\n\n paths.splice(0, paths.length, ...clippedPaths);\n return api;\n },\n line: (role: ToolpathRole, start: PointInput, end: PointInput, pathOptions: PathOptions = {}) => {\n paths.push(createPath(role, [pointFromInput(start, z), pointFromInput(end, z)], pathOptions));\n return api;\n },\n modify: (modifiers: PathModifier | PathModifier[]) => {\n paths.splice(0, paths.length, ...modifyPaths(paths, modifiers));\n return api;\n },\n offset: (distance: number, offsetOptions: OffsetOptions & PathOptions = {}) => {\n const offsetPaths = paths.flatMap((path): ToolpathPath[] => {\n if (!path.closed || path.points.length < 3) return [path];\n\n const rings = offsetClosedRing2MultiResult(\n path.points.map((point) => [point.x, point.y] satisfies Vec2),\n Math.abs(distance),\n {\n ...offsetOptions,\n side: offsetOptions.side ?? (distance >= 0 ? \"outward\" : \"inward\"),\n },\n );\n\n if (!rings.ok) return [];\n\n return rings.rings.map((ring, index) =>\n createPath(\n path.role,\n ring.map(([x, y]) => ({ x, y, z: path.z })),\n {\n closed: true,\n extrude: Boolean(path.extrusion),\n flow: path.extrusion?.flow,\n height: path.extrusion?.height,\n id: `${path.id}-offset-${index}`,\n speed: path.speed,\n width: path.extrusion?.width,\n },\n ),\n );\n });\n\n paths.splice(0, paths.length, ...offsetPaths);\n return api;\n },\n polyline: (role: ToolpathRole, points: readonly PointInput[], pathOptions: PathOptions = {}) => {\n paths.push(createPath(role, points.map((point) => pointFromInput(point, z)), pathOptions));\n return api;\n },\n polygon: (role: ToolpathRole, points: readonly PointInput[], pathOptions: PathOptions = {}) => {\n paths.push(createPath(role, points.map((point) => pointFromInput(point, z)), { ...pathOptions, closed: true }));\n return api;\n },\n };\n\n return api;\n};\n", "import type { Section } from \"../section/types\";\nimport type { ToolpathPath } from \"./types\";\nimport { offsetSectionRegion } from \"../section/region\";\n\ntype ToolpathDiagnosticLevel = \"info\" | \"warning\" | \"error\";\n\nexport const perimeterPaths = (\n section: Section,\n options: {\n count?: number;\n onDiagnostic?: (message: string, level?: ToolpathDiagnosticLevel) => void;\n layerIndex: number;\n lineWidth: number;\n layerHeight: number;\n miterLimit?: number;\n },\n): ToolpathPath[] => {\n const wallCount = Math.max(1, Math.round(options.count ?? 1));\n const paths: ToolpathPath[] = [];\n let sourceSection = section;\n\n for (let wallIndex = 0; wallIndex < wallCount; wallIndex += 1) {\n const inset = wallIndex === 0 ? options.lineWidth / 2 : options.lineWidth;\n const offsetSection = offsetSectionRegion(sourceSection, inset, {\n miterLimit: options.miterLimit,\n });\n\n for (const diagnostic of offsetSection.diagnostics) {\n if (diagnostic.level !== \"info\") {\n options.onDiagnostic?.(`Perimeter wall ${wallIndex + 1}: ${diagnostic.message}`, diagnostic.level);\n }\n }\n\n for (const curve of offsetSection.curves.filter((offsetCurve) => offsetCurve.role !== \"invalid\")) {\n const isExteriorWall = (curve.role === \"outer\" || curve.role === \"island\") && curve.points2.length >= 3;\n\n paths.push({\n id: `layer-${options.layerIndex}-perimeter-${wallIndex}-${paths.length}`,\n role: isExteriorWall && wallIndex === 0 ? \"outerWall\" : \"innerWall\",\n layerIndex: options.layerIndex,\n z: section.frame.origin[2],\n closed: true,\n points: curve.points2.map(([x, y]) => ({ x, y, z: 0 })),\n extrusion: {\n width: options.lineWidth,\n height: options.layerHeight,\n flow: options.lineWidth * options.layerHeight * 0.45,\n },\n speed: wallIndex === 0 ? 1800 : 2200,\n });\n }\n\n sourceSection = offsetSection;\n }\n\n return paths;\n};\n", "import type { Section } from \"../section/types\";\nimport { layerDistance } from \"../toolpath/coordinates\";\nimport type { ToolpathLayer, ToolpathPath } from \"../toolpath/types\";\n\nexport type LayerContext = {\n distance: number;\n layerIndex: number;\n plane: ToolpathLayer[\"plane\"];\n section: Section;\n sections: Section[];\n z: number;\n};\n\nexport type LayerResult = {\n distance: number;\n layerIndex: number;\n paths: ToolpathPath[];\n plane: ToolpathLayer[\"plane\"];\n z: number;\n};\n\nexport type LayerCallbackResult =\n | ToolpathPath\n | ToolpathPath[]\n | Array<ToolpathPath | ToolpathPath[]>\n | {\n paths?: ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]>;\n distance?: number;\n layerIndex?: number;\n plane?: ToolpathLayer[\"plane\"];\n z?: number;\n }\n | null\n | undefined;\n\nexport type LayerCallback = (layer: LayerContext) => LayerCallbackResult | Promise<LayerCallbackResult>;\n\nexport type ParallelLayerOptions = {\n sectionWindow?: number;\n workerPool?: boolean | number;\n};\n\ntype LayerWorkerRequest = {\n callbackSource: string;\n context: Record<string, unknown>;\n id: number;\n layerIndices: number[];\n sections: Section[];\n};\n\ntype LayerWorkerResponse = {\n error?: string;\n id: number;\n layers?: LayerResult[];\n};\n\nconst MAX_WORKERS = 8;\n\nconst createWorker = (): Worker => {\n throw new Error(\"Layer worker pool is not available in the Node runtime package.\");\n};\n\nconst workerCountFor = (layerCount: number, options: ParallelLayerOptions = {}) => {\n if (options.workerPool === false || layerCount < 2 || typeof Worker === \"undefined\") return 0;\n\n const hardwareConcurrency = typeof navigator === \"undefined\" ? 4 : navigator.hardwareConcurrency || 4;\n const requested = typeof options.workerPool === \"number\" ? options.workerPool : hardwareConcurrency - 1;\n return Math.min(layerCount, MAX_WORKERS, Math.max(1, Math.floor(requested)));\n};\n\nconst chunkLayerIndices = (layerCount: number, chunkCount: number) => {\n const chunks: number[][] = Array.from({ length: chunkCount }, () => []);\n\n for (let index = 0; index < layerCount; index += 1) {\n chunks[index % chunkCount].push(index);\n }\n\n return chunks;\n};\n\nconst chunkLayerRanges = (layerCount: number, chunkCount: number) => {\n const chunks: number[][] = [];\n const chunkSize = Math.ceil(layerCount / chunkCount);\n\n for (let start = 0; start < layerCount; start += chunkSize) {\n const end = Math.min(layerCount, start + chunkSize);\n const chunk: number[] = [];\n for (let index = start; index < end; index += 1) {\n chunk.push(index);\n }\n chunks.push(chunk);\n }\n\n return chunks;\n};\n\nconst sectionWindowFor = (options: ParallelLayerOptions) => {\n if (typeof options.sectionWindow !== \"number\" || !Number.isFinite(options.sectionWindow)) return undefined;\n return Math.max(0, Math.ceil(options.sectionWindow));\n};\n\nconst windowedSectionsForChunk = (sections: Section[], layerIndices: readonly number[], sectionWindow?: number) => {\n if (typeof sectionWindow !== \"number\") return sections;\n if (layerIndices.length === 0) return sections;\n\n const minLayerIndex = Math.min(...layerIndices);\n const maxLayerIndex = Math.max(...layerIndices);\n const start = Math.max(0, minLayerIndex - sectionWindow);\n const end = Math.min(sections.length - 1, maxLayerIndex + sectionWindow);\n const windowed = new Array(sections.length) as Section[];\n\n for (let index = start; index <= end; index += 1) {\n windowed[index] = sections[index];\n }\n\n return windowed;\n};\n\nconst flattenPaths = (paths: ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]> | null | undefined): ToolpathPath[] => {\n if (!paths) return [];\n return Array.isArray(paths) ? paths.flatMap((path) => flattenPaths(path)) : [paths];\n};\n\nconst normalizeLayerResult = (\n result: LayerCallbackResult,\n layerIndex: number,\n fallback: Pick<LayerResult, \"distance\" | \"plane\" | \"z\">,\n): LayerResult => {\n if (result && typeof result === \"object\" && !Array.isArray(result) && \"paths\" in result) {\n return {\n distance: typeof result.distance === \"number\" ? result.distance : fallback.distance,\n layerIndex: typeof result.layerIndex === \"number\" ? result.layerIndex : layerIndex,\n paths: flattenPaths(result.paths),\n plane: result.plane ?? fallback.plane,\n z: typeof result.z === \"number\" ? result.z : fallback.z,\n };\n }\n\n return {\n distance: fallback.distance,\n layerIndex,\n paths: flattenPaths(result as ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]> | null | undefined),\n plane: fallback.plane,\n z: fallback.z,\n };\n};\n\nconst sectionDistance = (section: Section) =>\n section.spec.kind === \"plane\" && typeof section.spec.distance === \"number\"\n ? section.spec.distance\n : layerDistance(section.frame);\n\nconst mapLayerIndicesSync = async (sections: Section[], layerIndices: number[], callback: LayerCallback) => {\n const layers: LayerResult[] = [];\n\n for (const layerIndex of layerIndices) {\n const section = sections[layerIndex];\n if (!section) continue;\n const z = section.frame.origin[2];\n const distance = sectionDistance(section);\n const result = await callback({ distance, layerIndex, plane: section.frame, section, sections, z });\n layers.push(normalizeLayerResult(result, layerIndex, { distance, plane: section.frame, z }));\n }\n\n return layers;\n};\n\nconst runLayerChunkInWorker = (\n sections: Section[],\n layerIndices: number[],\n context: Record<string, unknown>,\n callbackSource: string,\n id: number,\n) =>\n new Promise<LayerResult[]>((resolve, reject) => {\n const worker = createWorker();\n\n worker.onmessage = ({ data }: MessageEvent<LayerWorkerResponse>) => {\n worker.terminate();\n if (data.id !== id) return;\n if (data.error) {\n reject(new Error(data.error));\n return;\n }\n resolve(data.layers ?? []);\n };\n\n worker.onerror = (event) => {\n worker.terminate();\n reject(new Error(event.message || \"Layer worker failed.\"));\n };\n\n worker.postMessage({\n callbackSource,\n context,\n id,\n layerIndices,\n sections,\n } satisfies LayerWorkerRequest);\n });\n\nexport const mapLayersSync = async (sections: Section[], callback: LayerCallback) =>\n mapLayerIndicesSync(sections, sections.map((_section, index) => index), callback);\n\nexport const parallelLayersWithWorkerPool = async (\n sections: Section[],\n context: Record<string, unknown>,\n callback: LayerCallback,\n options: ParallelLayerOptions = {},\n) => {\n const workerCount = workerCountFor(sections.length, options);\n if (workerCount <= 1) return mapLayersSync(sections, callback);\n\n const sectionWindow = sectionWindowFor(options);\n const chunks = (typeof sectionWindow === \"number\"\n ? chunkLayerRanges(sections.length, workerCount)\n : chunkLayerIndices(sections.length, workerCount)\n ).filter((chunk) => chunk.length > 0);\n const callbackSource = callback.toString();\n const layerChunks = await Promise.all(\n chunks.map((chunk, index) =>\n runLayerChunkInWorker(windowedSectionsForChunk(sections, chunk, sectionWindow), chunk, context, callbackSource, index + 1),\n ),\n );\n\n return layerChunks.flat().sort((a, b) => a.layerIndex - b.layerIndex);\n};\n", "import { connectSectionSegments } from \"../section/connect\";\nimport type { Section, SliceOptions } from \"../section/types\";\n\ntype ConnectSectionsRequest = {\n id: number;\n options: SliceOptions;\n sections: Section[];\n};\n\ntype ConnectSectionsResponse = {\n error?: string;\n id: number;\n sections?: Section[];\n};\n\nconst MAX_WORKERS = 8;\n\nconst createWorker = (): Worker => {\n throw new Error(\"Section worker pool is not available in the Node runtime package.\");\n};\n\nconst workerCountFor = (sectionCount: number, options: SliceOptions) => {\n if (options.workerPool === false || sectionCount < 2 || typeof Worker === \"undefined\") return 0;\n\n const hardwareConcurrency = typeof navigator === \"undefined\" ? 4 : navigator.hardwareConcurrency || 4;\n const requested = typeof options.workerPool === \"number\" ? options.workerPool : hardwareConcurrency - 1;\n return Math.min(sectionCount, MAX_WORKERS, Math.max(1, Math.floor(requested)));\n};\n\nconst chunkSections = (sections: Section[], chunkCount: number) => {\n const chunks: Section[][] = Array.from({ length: chunkCount }, () => []);\n\n for (let index = 0; index < sections.length; index += 1) {\n chunks[index % chunkCount].push(sections[index]);\n }\n\n return chunks;\n};\n\nconst connectChunkInWorker = (sections: Section[], options: SliceOptions, id: number) =>\n new Promise<Section[]>((resolve, reject) => {\n const worker = createWorker();\n\n worker.onmessage = ({ data }: MessageEvent<ConnectSectionsResponse>) => {\n worker.terminate();\n if (data.id !== id) return;\n if (data.error) {\n reject(new Error(data.error));\n return;\n }\n resolve(data.sections ?? []);\n };\n\n worker.onerror = (event) => {\n worker.terminate();\n reject(new Error(event.message || \"Section worker failed.\"));\n };\n\n worker.postMessage({\n id,\n options: {\n ...options,\n workerPool: false,\n },\n sections,\n } satisfies ConnectSectionsRequest);\n });\n\nconst connectSectionsSync = (sections: Section[], options: SliceOptions) =>\n sections.map((section) =>\n connectSectionSegments(section, {\n ...options,\n workerPool: false,\n }),\n );\n\nexport const connectSectionsWithWorkerPool = async (sections: Section[], options: SliceOptions = {}) => {\n const workerCount = workerCountFor(sections.length, options);\n if (workerCount <= 1) return connectSectionsSync(sections, options);\n\n const chunks = chunkSections(sections, workerCount);\n const connectedChunks = await Promise.all(chunks.map((chunk, index) => connectChunkInWorker(chunk, options, index + 1)));\n const connectedByOriginalIndex: Section[] = [];\n\n for (let chunkIndex = 0; chunkIndex < connectedChunks.length; chunkIndex += 1) {\n const connectedChunk = connectedChunks[chunkIndex];\n for (let itemIndex = 0; itemIndex < connectedChunk.length; itemIndex += 1) {\n connectedByOriginalIndex[chunkIndex + itemIndex * workerCount] = connectedChunk[itemIndex];\n }\n }\n\n return connectedByOriginalIndex.filter(Boolean);\n};\n", "import { editGcode, type GcodeEditor } from \"../gcode/editor\";\nimport { exportGcode as emitGcode, type GcodeExportDiagnostic, type GcodeExportOptions } from \"../gcode/exporter\";\nimport { filament as filamentProfile, preset as printerPreset } from \"../gcode/presets\";\nimport { initClipperKernel } from \"../geometry/kernel/offset\";\nimport { validateKernelSmokeFixtures } from \"../geometry/kernel/validate\";\nimport type { Vec3 } from \"../geometry/types\";\nimport { parseStl } from \"../mesh/stl\";\nimport { transformMesh, translateMesh } from \"../mesh/transform\";\nimport type { Mesh } from \"../mesh/types\";\nimport { connectSectionSegments } from \"../section/connect\";\nimport { Plane, railPlanes } from \"../section/plane\";\nimport { createSectionRegion } from \"../section/region\";\nimport { intersectMeshWithPlaneStack, intersectMeshWithSection } from \"../section/slice\";\nimport type { PlaneSectionSpec, Section, SectionSpec, SliceOptions } from \"../section/types\";\nimport { calculatePrintStats } from \"../toolpath/stats\";\nimport { validateToolpathSmokeFixtures } from \"../toolpath/validate\";\nimport {\n bottomSolidFillPaths,\n fillLayerPaths,\n fillRegionLayerPaths,\n fillRegionPaths,\n lineInfillPaths,\n pathRegion,\n sparseInfillPaths,\n topSolidFillPaths,\n type FillField,\n} from \"../toolpath/infill\";\nimport { pathLayer } from \"../toolpath/builder\";\nimport { modifyPaths, noise, resample, sine, zigzag } from \"../toolpath/modifiers\";\nimport { perimeterPaths } from \"../toolpath/perimeters\";\nimport { planLayerPaths } from \"../toolpath/planning\";\nimport { horizontalLayerFrame, layerDistance, layerLocalPathToBuild, normalizeLayerFrame } from \"../toolpath/coordinates\";\nimport type { PrinterProfile, ToolpathGraph, ToolpathLayer, ToolpathPath, ToolpathRole } from \"../toolpath/types\";\nimport { mapLayersSync, parallelLayersWithWorkerPool, type LayerCallback, type ParallelLayerOptions } from \"./layerWorkerPool\";\nimport { connectSectionsWithWorkerPool } from \"./sectionWorkerPool\";\nimport type { ParamSchema, ParamValues, RuntimeDiagnostic, RuntimeProgress, RuntimeScene, RuntimeScenePlacement, RuntimeStage } from \"./types\";\n\ntype FuseScriptRuntimeInput = {\n files: Map<string, Uint8Array>;\n mode?: RuntimeStage;\n onProgress?: (progress: RuntimeProgress) => void;\n source: string;\n values: ParamValues;\n};\n\ntype AxisObject = readonly [number, number, number] & {\n x: number;\n y: number;\n z: number;\n};\n\ntype BoundsObject = {\n min: AxisObject;\n max: AxisObject;\n center: AxisObject;\n size: AxisObject;\n};\n\ntype RuntimeMesh = {\n bounds: () => BoundsObject;\n mesh: Mesh;\n translate: (offset: { x?: number; y?: number; z?: number } | Vec3) => RuntimeMesh;\n};\n\ntype ToolpathBuilder = {\n addLayer: (\n layerOrZ:\n | number\n | {\n distance?: number;\n layerIndex?: number;\n paths: ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]>;\n plane?: Partial<ToolpathLayer[\"plane\"]> & { origin: Vec3; normal: Vec3 };\n z?: number;\n },\n paths?: ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]>,\n ) => void;\n toGraph: () => ToolpathGraph;\n};\n\ntype SceneModelItem = {\n bounds: () => BoundsObject;\n id?: string;\n kind: \"model\";\n mesh: () => RuntimeMesh;\n path: string;\n place: (placement: ScenePlacement) => SceneModelItem;\n placement: ScenePlacement;\n previewMesh: () => RuntimeMesh;\n translate: (offset: { x?: number; y?: number; z?: number } | Vec3) => SceneModelItem;\n};\n\ntype ScenePathItem = {\n kind: \"paths\";\n name: string;\n paths: () => ToolpathPath[];\n};\n\ntype ScenePlacement = {\n id?: string;\n name?: string;\n position?: Vec3;\n rotation?: Vec3;\n rotateX?: number;\n rotateY?: number;\n rotateZ?: number;\n scale?: number | Vec3;\n x?: number;\n y?: number;\n z?: number;\n};\n\ntype FuseScriptRuntimeOutput = {\n diagnostics: RuntimeDiagnostic[];\n gcode?: string;\n graph?: ToolpathGraph;\n hasGcodeExport: boolean;\n hasToolpathExport: boolean;\n params: ParamSchema[];\n scene?: RuntimeScene;\n stage: RuntimeStage;\n};\n\ntype GcodeExportContext = {\n editGcode: (source: string | string[]) => GcodeEditor;\n generateGcode: (graphLike: ToolpathBuilder | ToolpathGraph, options?: GcodeExportOptions) => string;\n graph: ToolpathGraph;\n};\n\ntype NumberParamOptions = {\n description?: string;\n group?: string;\n max?: number;\n min?: number;\n step?: number;\n unit?: string;\n};\n\ntype ParamMetaOptions = {\n description?: string;\n group?: string;\n};\n\nconst axis = ([x, y, z]: Vec3): AxisObject => Object.assign([x, y, z] as [number, number, number], { x, y, z });\n\nconst boundsObject = (mesh: Mesh): BoundsObject => {\n const min = axis(mesh.bounds.min);\n const max = axis(mesh.bounds.max);\n const center = axis([(min.x + max.x) / 2, (min.y + max.y) / 2, (min.z + max.z) / 2]);\n const size = axis([max.x - min.x, max.y - min.y, max.z - min.z]);\n\n return { min, max, center, size };\n};\n\nconst normalizePath = (path: string) => path.replace(/^\\.\\//, \"\").replaceAll(\"\\\\\", \"/\");\n\nconst paramId = (label: string) => {\n const id = label\n .trim()\n .replace(/^[^A-Za-z_$]+/, \"\")\n .replace(/[^A-Za-z0-9_$]+(.)/g, (_match, letter: string) => letter.toUpperCase())\n .replace(/[^A-Za-z0-9_$]/g, \"\");\n\n return id ? id[0].toLowerCase() + id.slice(1) : label;\n};\n\nconst paramMeta = (options: ParamMetaOptions = {}) => ({\n description: typeof options.description === \"string\" && options.description.trim() ? options.description : undefined,\n group: typeof options.group === \"string\" && options.group.trim() ? options.group : undefined,\n});\n\nconst meshWrapper = (mesh: Mesh): RuntimeMesh => ({\n mesh,\n bounds: () => boundsObject(mesh),\n translate: (offset) => meshWrapper(translateMesh(mesh, offsetVector(offset))),\n});\n\nconst defaultPrinter = (overrides: Partial<PrinterProfile> = {}): PrinterProfile => ({\n bed: overrides.bed,\n buildArea: overrides.buildArea,\n capabilities: overrides.capabilities,\n coordinates: overrides.coordinates,\n defaults: overrides.defaults,\n filament: overrides.filament ?? 1.75,\n gcodeFlavor: overrides.gcodeFlavor,\n layerHeight: overrides.layerHeight ?? 0.2,\n machineFrame: overrides.machineFrame ?? overrides.coordinates?.machineFrame,\n name: overrides.name,\n nozzle: overrides.nozzle ?? 0.4,\n process: overrides.process,\n travel: overrides.travel,\n});\n\nconst tuple3 = (value: unknown, fallback: Vec3): Vec3 => {\n if (Array.isArray(value)) {\n return [\n Number(value[0] ?? fallback[0]),\n Number(value[1] ?? fallback[1]),\n Number(value[2] ?? fallback[2]),\n ];\n }\n\n return fallback;\n};\n\nconst normalizePlacement = (placement: ScenePlacement = {}): RuntimeScenePlacement => {\n const position = tuple3(placement.position, [\n Number(placement.x ?? 0),\n Number(placement.y ?? 0),\n Number(placement.z ?? 0),\n ]);\n const rotation = tuple3(placement.rotation, [\n Number(placement.rotateX ?? 0),\n Number(placement.rotateY ?? 0),\n Number(placement.rotateZ ?? 0),\n ]);\n const scale = Array.isArray(placement.scale)\n ? tuple3(placement.scale, [1, 1, 1])\n : [Number(placement.scale ?? 1), Number(placement.scale ?? 1), Number(placement.scale ?? 1)] as Vec3;\n\n return {\n name: typeof placement.name === \"string\" ? placement.name : undefined,\n position,\n rotation,\n scale,\n };\n};\n\nconst offsetVector = (offset: { x?: number; y?: number; z?: number } | Vec3): Vec3 => {\n const objectOffset = offset as { x?: number; y?: number; z?: number };\n return Array.isArray(offset)\n ? [Number(offset[0] ?? 0), Number(offset[1] ?? 0), Number(offset[2] ?? 0)]\n : [objectOffset.x ?? 0, objectOffset.y ?? 0, objectOffset.z ?? 0];\n};\n\nconst serializeMeshPreview = (mesh: Mesh) => ({\n bounds: {\n min: mesh.bounds.min,\n max: mesh.bounds.max,\n },\n positions: mesh.triangles.flatMap((triangle) => [\n ...triangle.a,\n ...triangle.b,\n ...triangle.c,\n ]),\n});\n\nconst serializeSceneItem = (item: unknown, includeMeshes: boolean) => {\n const candidate = item as Partial<SceneModelItem | ScenePathItem>;\n\n if (candidate.kind === \"model\") {\n const placement = normalizePlacement(candidate.placement);\n\n return {\n id: candidate.id,\n kind: \"model\",\n path: candidate.path,\n placement,\n preview: includeMeshes && typeof candidate.previewMesh === \"function\" ? serializeMeshPreview(candidate.previewMesh().mesh) : undefined,\n };\n }\n\n if (candidate.kind === \"paths\") {\n return {\n kind: \"paths\",\n name: candidate.name,\n };\n }\n\n return item;\n};\n\nconst serializeScene = (input: RuntimeScene | { items?: unknown[]; printer?: unknown }, includeMeshes: boolean): RuntimeScene => ({\n printer: input.printer,\n items: (input.items ?? []).map((item) => serializeSceneItem(item, includeMeshes)),\n});\n\nconst flattenPaths = (paths: ToolpathPath | ToolpathPath[] | Array<ToolpathPath | ToolpathPath[]>): ToolpathPath[] =>\n Array.isArray(paths) ? paths.flatMap((path) => flattenPaths(path)) : [paths];\n\nconst finalizeBuildPath = (path: ToolpathPath, layerIndex: number, z: number, printer: PrinterProfile): ToolpathPath => ({\n ...path,\n id: path.id.replace(/^layer-\\d+/, `layer-${layerIndex}`),\n layerIndex,\n z,\n points: path.points.map((point) => ({ ...point, z })),\n extrusion: path.extrusion\n ? {\n ...path.extrusion,\n height: path.extrusion.height || printer.layerHeight,\n }\n : undefined,\n});\n\nconst finalizeLayerPath = (path: ToolpathPath, layerIndex: number, plane: ToolpathLayer[\"plane\"], z: number, printer: PrinterProfile): ToolpathPath => ({\n ...layerLocalPathToBuild(path, plane),\n id: path.id.replace(/^layer-\\d+/, `layer-${layerIndex}`),\n layerIndex,\n z,\n extrusion: path.extrusion\n ? {\n ...path.extrusion,\n height: path.extrusion.height || printer.layerHeight,\n }\n : undefined,\n});\n\nconst createToolpathBuilder = (printer: PrinterProfile): ToolpathBuilder => {\n const layers: ToolpathLayer[] = [];\n\n const toGraph = (): ToolpathGraph => {\n const graph = {\n units: \"mm\" as const,\n printer,\n layers,\n };\n\n return {\n ...graph,\n stats: calculatePrintStats(graph),\n };\n };\n\n return {\n addLayer: (layerOrZ, inputPaths) => {\n if (typeof layerOrZ === \"number\") {\n const layerIndex = layers.length;\n const z = layerOrZ;\n const paths = flattenPaths(inputPaths ?? []).map((path) => finalizeBuildPath(path, layerIndex, z, printer));\n layers.push({\n distance: z,\n index: layerIndex,\n paths,\n plane: horizontalLayerFrame(z),\n z,\n });\n return;\n }\n\n const layerIndex = layerOrZ.layerIndex ?? layers.length;\n const plane = normalizeLayerFrame(layerOrZ.plane ?? horizontalLayerFrame(layerOrZ.z ?? 0));\n const distance = layerOrZ.distance ?? layerDistance(plane);\n const z = layerOrZ.z ?? plane.origin[2];\n const paths = flattenPaths(layerOrZ.paths).map((path) => finalizeLayerPath(path, layerIndex, plane, z, printer));\n layers.push({\n distance,\n index: layerIndex,\n paths,\n plane,\n z,\n });\n },\n toGraph,\n };\n};\n\nconst sectionToToolpathPaths = (\n section: Section,\n options: {\n includeOpen?: boolean;\n layerIndex?: number;\n openRole?: ToolpathRole;\n role?: ToolpathRole | ((role: Section[\"curves\"][number][\"role\"], index: number) => ToolpathRole);\n speed?: number;\n z?: number;\n } = {},\n): ToolpathPath[] => {\n const layerIndex = options.layerIndex ?? 0;\n const z = options.z ?? section.frame.origin[2];\n const speed = options.speed ?? 1200;\n const roleForCurve = (role: Section[\"curves\"][number][\"role\"], index: number): ToolpathRole => {\n if (typeof options.role === \"function\") return options.role(role, index);\n if (options.role) return options.role;\n return role === \"hole\" ? \"innerWall\" : \"outerWall\";\n };\n const pointToToolpathPoint = ([x, y]: readonly [number, number]) => ({ x, y, z: 0 });\n\n const closedPaths = section.curves\n .filter((curve) => curve.role !== \"invalid\" && curve.points2.length >= 3)\n .map((curve, index): ToolpathPath => ({\n id: `section-${layerIndex}-curve-${index}`,\n role: roleForCurve(curve.role, index),\n layerIndex,\n z,\n closed: true,\n points: curve.points2.map(pointToToolpathPoint),\n speed,\n }));\n\n if (!options.includeOpen) return closedPaths;\n\n const openPaths = section.openCurves\n .filter((curve) => curve.points2.length >= 2)\n .map((curve, index): ToolpathPath => ({\n id: `section-${layerIndex}-open-${index}`,\n role: options.openRole ?? \"travel\",\n layerIndex,\n z,\n closed: false,\n points: curve.points2.map(pointToToolpathPoint),\n speed,\n }));\n\n return [...closedPaths, ...openPaths];\n};\n\nconst valueOrDefault = (values: ParamValues, id: string, fallback: number | boolean | string) => values[id] ?? fallback;\n\nconst isRuntimeMesh = (input: unknown): input is RuntimeMesh => {\n const candidate = input as Partial<RuntimeMesh>;\n return typeof candidate.bounds === \"function\" && typeof candidate.translate === \"function\" && typeof candidate.mesh === \"object\";\n};\n\nconst isSceneModelItem = (input: unknown): input is SceneModelItem => {\n const candidate = input as Partial<SceneModelItem>;\n return candidate.kind === \"model\" && typeof candidate.mesh === \"function\";\n};\n\nconst runtimeMeshFrom = (input: RuntimeMesh | Mesh | SceneModelItem): RuntimeMesh => {\n if (isSceneModelItem(input)) return input.mesh();\n if (isRuntimeMesh(input)) return input;\n return meshWrapper(input);\n};\n\nconst AsyncFunction = Object.getPrototypeOf(async function () {}).constructor as FunctionConstructor;\n\nexport const runFuseScript = async ({ files, mode = \"toolpath\", onProgress, source, values }: FuseScriptRuntimeInput): Promise<FuseScriptRuntimeOutput> => {\n const diagnostics: RuntimeDiagnostic[] = [];\n const params: ParamSchema[] = [];\n let exportedGraph: ToolpathGraph | undefined;\n let exportedScene: RuntimeScene | undefined;\n let toolpathExportCallback: (() => Promise<ToolpathBuilder | ToolpathGraph> | ToolpathBuilder | ToolpathGraph) | undefined;\n let legacyExportedGcode: string | undefined;\n let gcodeExportCallback: ((context: GcodeExportContext) => string) | undefined;\n let lastGraph: ToolpathBuilder | undefined;\n let sectionWarningCount = 0;\n let toolpathWarningCount = 0;\n const reportProgress = (label: string, percent: number) => {\n onProgress?.({\n label,\n percent: Math.max(0, Math.min(99, percent)),\n stage: mode,\n });\n };\n\n reportProgress(\"Initializing geometry kernel\", 16);\n await initClipperKernel();\n reportProgress(\"Validating geometry kernel\", 18);\n const kernelIssues = validateKernelSmokeFixtures();\n\n for (const issue of kernelIssues) {\n diagnostics.push({\n level: issue.level,\n message: `Geometry kernel validation: ${issue.message}`,\n });\n }\n\n const toolpathIssues = validateToolpathSmokeFixtures();\n for (const issue of toolpathIssues) {\n diagnostics.push({\n level: issue.level,\n message: `Toolpath validation: ${issue.message}`,\n });\n }\n\n const toGraph = (graphLike: ToolpathBuilder | ToolpathGraph) => (\"toGraph\" in graphLike ? graphLike.toGraph() : graphLike);\n const recordGcodeDiagnostic = (diagnostic: GcodeExportDiagnostic) => {\n diagnostics.push({\n level: diagnostic.level,\n message: `G-code export: ${diagnostic.message}`,\n });\n };\n const generateGcode = (graphLike: ToolpathBuilder | ToolpathGraph, options?: GcodeExportOptions) => {\n const userOnDiagnostic = options?.onDiagnostic;\n return emitGcode(toGraph(graphLike), {\n ...options,\n onDiagnostic: (diagnostic) => {\n recordGcodeDiagnostic(diagnostic);\n userOnDiagnostic?.(diagnostic);\n },\n });\n };\n const stlCache = new Map<string, RuntimeMesh>();\n const loadRuntimeStl = (path: string) => {\n const normalizedPath = normalizePath(path);\n const candidatePaths = normalizedPath.includes(\"/\") ? [normalizedPath] : [`models/${normalizedPath}`, normalizedPath];\n let resolvedPath = candidatePaths.find((candidate) => files.has(candidate)) ?? normalizedPath;\n let bytes = files.get(resolvedPath);\n if (!bytes && files.size === 1) {\n const onlyFile = [...files.entries()][0];\n resolvedPath = onlyFile[0];\n bytes = onlyFile[1];\n diagnostics.push({\n level: \"warning\",\n message: `${path} was not found. Using the only imported STL instead: ${resolvedPath}.`,\n });\n }\n\n if (!bytes) {\n throw new Error(`STL not found in project: ${path}`);\n }\n\n const cached = stlCache.get(resolvedPath);\n if (cached) return cached;\n\n const mesh = parseStl(bytes, resolvedPath);\n diagnostics.push({\n level: \"info\",\n message: `Parsed ${mesh.triangles.length} STL triangles from ${resolvedPath}.`,\n });\n const wrapped = meshWrapper(mesh);\n stlCache.set(resolvedPath, wrapped);\n return wrapped;\n };\n const createSceneModel = (path: string, placement: ScenePlacement = {}): SceneModelItem => {\n const item: SceneModelItem = {\n bounds: () => item.mesh().bounds(),\n id: typeof placement.id === \"string\" ? placement.id : undefined,\n kind: \"model\",\n path,\n placement,\n mesh: () => meshWrapper(transformMesh(loadRuntimeStl(path).mesh, normalizePlacement(item.placement))),\n place: (nextPlacement) => {\n item.placement = {\n ...item.placement,\n ...nextPlacement,\n };\n if (typeof nextPlacement.id === \"string\") {\n item.id = nextPlacement.id;\n }\n return item;\n },\n previewMesh: () => loadRuntimeStl(path),\n translate: (offset) => {\n const current = normalizePlacement(item.placement);\n const vector = offsetVector(offset);\n return createSceneModel(path, {\n ...item.placement,\n position: [\n current.position[0] + vector[0],\n current.position[1] + vector[1],\n current.position[2] + vector[2],\n ],\n });\n },\n };\n\n return item;\n };\n const recordRuntimeDiagnostic = (diagnostic: RuntimeDiagnostic, maxDiagnostics?: number) => {\n const limit = maxDiagnostics ?? 200;\n if (limit <= 0 || diagnostics.length >= limit) return;\n diagnostics.push(diagnostic);\n };\n const runtimeDiagnosticsFull = (maxDiagnostics?: number) => diagnostics.length >= (maxDiagnostics ?? 200);\n const sectionDiagnosticMode = (options: SliceOptions) => options.diagnostics ?? \"warnings\";\n const recordSectionDiagnostics = (section: Section, options: SliceOptions = {}) => {\n const mode = sectionDiagnosticMode(options);\n if (mode === \"none\") return;\n\n const maxDiagnostics = options.maxDiagnostics;\n if (runtimeDiagnosticsFull(maxDiagnostics)) return;\n if (mode === \"all\") {\n for (const diagnostic of section.diagnostics) {\n recordRuntimeDiagnostic(diagnostic, maxDiagnostics);\n if (runtimeDiagnosticsFull(maxDiagnostics)) return;\n }\n } else {\n for (const diagnostic of section.diagnostics) {\n if (diagnostic.level === \"info\") continue;\n recordRuntimeDiagnostic(diagnostic, maxDiagnostics);\n if (runtimeDiagnosticsFull(maxDiagnostics)) return;\n }\n }\n\n const invalidCount = section.curves.filter((curve) => curve.role === \"invalid\").length;\n const hasBrokenSection = section.curves.length === 0 || invalidCount > 0 || section.openCurves.length > 0;\n\n if (!hasBrokenSection) return;\n\n if (sectionWarningCount < 20) {\n recordRuntimeDiagnostic({\n level: \"warning\",\n message: `Slice at z=${section.frame.origin[2].toFixed(3)} generated ${section.curves.length} closed curves, ${section.openCurves.length} open curves, and ${invalidCount} invalid curves.`,\n }, maxDiagnostics);\n } else if (sectionWarningCount === 20) {\n recordRuntimeDiagnostic({\n level: \"warning\",\n message: \"Additional broken slice diagnostics were suppressed.\",\n }, maxDiagnostics);\n }\n\n sectionWarningCount += 1;\n };\n const recordToolpathDiagnostic = (message: string, level: RuntimeDiagnostic[\"level\"] = \"warning\") => {\n if (toolpathWarningCount < 30) {\n diagnostics.push({\n level,\n message,\n });\n } else if (toolpathWarningCount === 30) {\n diagnostics.push({\n level: \"warning\",\n message: \"Additional toolpath generation diagnostics were suppressed.\",\n });\n }\n\n toolpathWarningCount += 1;\n };\n const recordGraphWarnings = (graph: ToolpathGraph) => {\n const emptyExtrusionLayers = graph.layers.filter((layer) =>\n layer.paths.every((path) => path.role === \"travel\" || !path.extrusion),\n );\n\n if (emptyExtrusionLayers.length === 0) return;\n\n const sample = emptyExtrusionLayers\n .slice(0, 8)\n .map((layer) => `#${layer.index}@z=${layer.z.toFixed(3)}`)\n .join(\", \");\n\n diagnostics.push({\n level: \"warning\",\n message: `${emptyExtrusionLayers.length} layers have no extrusion paths: ${sample}${emptyExtrusionLayers.length > 8 ? \", ...\" : \"\"}.`,\n });\n };\n const connectSections = async (sections: Section[], options: SliceOptions = {}) => {\n try {\n reportProgress(`Connecting ${sections.length} slice sections`, 56);\n return await connectSectionsWithWorkerPool(sections, options);\n } catch (error) {\n recordRuntimeDiagnostic({\n level: \"warning\",\n message: `Section worker pool failed; falling back to synchronous connection: ${error instanceof Error ? error.message : String(error)}`,\n }, options.maxDiagnostics);\n return sections.map((section) =>\n connectSectionSegments(section, {\n ...options,\n workerPool: false,\n }),\n );\n }\n };\n const parallelLayerMap = async (\n sections: Section[],\n contextOrCallback: Record<string, unknown> | LayerCallback,\n callbackOrOptions?: LayerCallback | ParallelLayerOptions,\n maybeOptions: ParallelLayerOptions = {},\n ) => {\n const context = typeof contextOrCallback === \"function\" ? {} : contextOrCallback;\n const callback = typeof contextOrCallback === \"function\" ? contextOrCallback : callbackOrOptions;\n const options = typeof contextOrCallback === \"function\" ? (callbackOrOptions as ParallelLayerOptions | undefined) : maybeOptions;\n\n if (typeof callback !== \"function\") {\n throw new Error(\"parallelLayers expects a callback. Use parallelLayers(sections, context, callback, options).\");\n }\n\n try {\n reportProgress(`Generating ${sections.length} toolpath layers`, 70);\n return await parallelLayersWithWorkerPool(sections, context, callback, options ?? {});\n } catch (error) {\n diagnostics.push({\n level: \"warning\",\n message: `Layer worker pool failed; falling back to synchronous layer generation: ${error instanceof Error ? error.message : String(error)}`,\n });\n return mapLayersSync(sections, callback);\n }\n };\n\n const api = {\n Param: {\n number: (label: string, defaultValue: number, options: NumberParamOptions = {}) => {\n const normalizedId = paramId(label);\n const value = Number(valueOrDefault(values, normalizedId, defaultValue));\n\n params.push({\n id: normalizedId,\n label,\n kind: \"number\",\n ...paramMeta(options),\n value,\n min: typeof options.min === \"number\" ? options.min : Math.min(0, defaultValue),\n max: typeof options.max === \"number\" ? options.max : Math.max(1, defaultValue * 2),\n step: typeof options.step === \"number\" ? options.step : undefined,\n unit: typeof options.unit === \"string\" ? options.unit : undefined,\n });\n\n return value;\n },\n boolean: (label: string, defaultValue: boolean, options: ParamMetaOptions = {}) => {\n const normalizedId = paramId(label);\n const value = Boolean(valueOrDefault(values, normalizedId, defaultValue));\n params.push({ id: normalizedId, label, kind: \"boolean\", ...paramMeta(options), value });\n return value;\n },\n select: (label: string, options: string[], defaultValue: string, meta: ParamMetaOptions = {}) => {\n const normalizedId = paramId(label);\n const rawValue = String(valueOrDefault(values, normalizedId, defaultValue));\n const value = options.includes(rawValue) ? rawValue : defaultValue;\n params.push({ id: normalizedId, label, kind: \"select\", ...paramMeta(meta), value, options });\n return value;\n },\n text: (label: string, defaultValue: string, options: ParamMetaOptions = {}) => {\n const normalizedId = paramId(label);\n const value = String(valueOrDefault(values, normalizedId, defaultValue));\n params.push({ id: normalizedId, label, kind: \"text\", ...paramMeta(options), value });\n return value;\n },\n },\n Plane,\n railPlanes,\n filament: filamentProfile,\n model: createSceneModel,\n preset: printerPreset,\n printer: (profile: Partial<PrinterProfile> = {}) => defaultPrinter(profile),\n scenePath: (name: string, callback: () => ToolpathPath[] | ToolpathPath | Array<ToolpathPath | ToolpathPath[]>): ScenePathItem => ({\n kind: \"paths\",\n name,\n paths: () => flattenPaths(callback()),\n }),\n exportScene: (scene: RuntimeScene | { items?: unknown[]; printer?: unknown }) => {\n exportedScene = serializeScene(scene, mode === \"scene\");\n return exportedScene;\n },\n exportToolpath: (\n graphLikeOrCallback: ToolpathBuilder | ToolpathGraph | (() => Promise<ToolpathBuilder | ToolpathGraph> | ToolpathBuilder | ToolpathGraph),\n ) => {\n if (typeof graphLikeOrCallback === \"function\") {\n toolpathExportCallback = graphLikeOrCallback;\n return graphLikeOrCallback;\n }\n\n exportedGraph = toGraph(graphLikeOrCallback);\n return exportedGraph;\n },\n exportGcode: (graphLike: ToolpathBuilder | ToolpathGraph, options?: GcodeExportOptions) => {\n exportedGraph = toGraph(graphLike);\n diagnostics.push({\n level: \"warning\",\n message: \"exportGcode(graph) is deprecated. Use exportToolpath(graph) and onExportGcode(makeGcode).\",\n });\n legacyExportedGcode = mode === \"gcode\" ? generateGcode(exportedGraph, options) : undefined;\n return legacyExportedGcode ?? \"\";\n },\n editGcode,\n generateGcode,\n onExportGcode: (callback: (context: GcodeExportContext) => string) => {\n if (typeof callback !== \"function\") {\n throw new Error(\"onExportGcode expects a function.\");\n }\n\n gcodeExportCallback = callback;\n },\n modifyPaths,\n mapLayers: (sections: Section[], callback: LayerCallback) => mapLayersSync(sections, callback),\n noise,\n parallelLayers: parallelLayerMap,\n pathLayer,\n pathRegion,\n planLayerPaths,\n resample,\n sine,\n zigzag,\n lineInfill: (\n section: Section,\n options: {\n angle?: number;\n density?: number;\n field?: FillField;\n layerHeight?: number;\n lineWidth?: number;\n margin?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n spacing?: number;\n } = {},\n ) =>\n lineInfillPaths(section, {\n angle: options.angle,\n layerIndex: 0,\n density: options.density ?? 0.18,\n field: options.field,\n lineWidth: options.lineWidth ?? 0.44,\n layerHeight: options.layerHeight ?? 0.2,\n margin: options.margin,\n onDiagnostic: recordToolpathDiagnostic,\n pattern: options.pattern,\n spacing: options.spacing,\n }),\n fillRegion: (\n target: Parameters<typeof fillRegionPaths>[0],\n options: {\n angle?: number;\n density?: number;\n field?: FillField;\n layerHeight?: number;\n layerIndex?: number;\n lineWidth?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n role?: ToolpathRole;\n spacing?: number;\n } = {},\n ) =>\n fillRegionPaths(target, {\n angle: options.angle,\n density: options.density,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex: options.layerIndex ?? 0,\n lineWidth: options.lineWidth ?? 0.44,\n pattern: options.pattern,\n role: options.role,\n spacing: options.spacing,\n }),\n fillLayer: (\n sections: Section[],\n layerIndex: number,\n options: {\n bottomAngle?: number;\n bottomPattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n density?: number;\n field?: FillField;\n layerHeight?: number;\n lineWidth?: number;\n margin?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n solidLayers?: number;\n sparseAngle?: number;\n sparsePattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n sparseSpacing?: number;\n topAngle?: number;\n topPattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n } = {},\n ) =>\n fillLayerPaths(sections, layerIndex, {\n bottomAngle: options.bottomAngle,\n bottomPattern: options.bottomPattern,\n density: options.density ?? 0.18,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex,\n lineWidth: options.lineWidth ?? 0.44,\n margin: options.margin,\n onDiagnostic: recordToolpathDiagnostic,\n pattern: options.pattern,\n solidLayers: options.solidLayers,\n sparseAngle: options.sparseAngle,\n sparsePattern: options.sparsePattern,\n sparseSpacing: options.sparseSpacing,\n topAngle: options.topAngle,\n topPattern: options.topPattern,\n }),\n fillRegionLayer: (\n regions: Parameters<typeof fillRegionLayerPaths>[0],\n layerIndex: number,\n options: {\n bottomAngle?: number;\n bottomPattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n density?: number;\n field?: FillField;\n layerHeight?: number;\n lineWidth?: number;\n margin?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n solidLayers?: number;\n sparseAngle?: number;\n sparsePattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n sparseSpacing?: number;\n topAngle?: number;\n topPattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n } = {},\n ) =>\n fillRegionLayerPaths(regions, layerIndex, {\n bottomAngle: options.bottomAngle,\n bottomPattern: options.bottomPattern,\n density: options.density ?? 0.18,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex,\n lineWidth: options.lineWidth ?? 0.44,\n margin: options.margin,\n onDiagnostic: recordToolpathDiagnostic,\n pattern: options.pattern,\n solidLayers: options.solidLayers,\n sparseAngle: options.sparseAngle,\n sparsePattern: options.sparsePattern,\n sparseSpacing: options.sparseSpacing,\n topAngle: options.topAngle,\n topPattern: options.topPattern,\n }),\n loadSTL: loadRuntimeStl,\n perimeters: (section: Section, options: { count?: number; layerHeight?: number; lineWidth?: number; miterLimit?: number } = {}) =>\n perimeterPaths(section, {\n count: options.count,\n layerIndex: 0,\n lineWidth: options.lineWidth ?? 0.44,\n layerHeight: options.layerHeight ?? 0.2,\n miterLimit: options.miterLimit,\n onDiagnostic: recordToolpathDiagnostic,\n }),\n region: (section: Section) => createSectionRegion(section),\n rawSegments: (section: Section) => section.rawCurves ?? [],\n sectionPaths: sectionToToolpathPaths,\n slice: (runtimeMesh: RuntimeMesh | Mesh | SceneModelItem, sectionSpec: SectionSpec, options: SliceOptions = {}) => {\n const mesh = runtimeMeshFrom(runtimeMesh).mesh;\n reportProgress(\"Slicing section\", 42);\n const rawSection = intersectMeshWithSection(mesh, sectionSpec, options);\n const section = options.connect === false ? rawSection : connectSectionSegments(rawSection, options);\n recordSectionDiagnostics(section, options);\n return section;\n },\n sliceStack: (runtimeMesh: RuntimeMesh | Mesh | SceneModelItem, planes: PlaneSectionSpec[], options: SliceOptions = {}) => {\n const mesh = runtimeMeshFrom(runtimeMesh).mesh;\n reportProgress(`Slicing ${planes.length} planes`, 42);\n const rawSections = intersectMeshWithPlaneStack(mesh, planes, options);\n reportProgress(`Generated ${rawSections.length} raw sections`, 52);\n const sections = options.connect === false\n ? rawSections\n : rawSections.map((section) => connectSectionSegments(section, options));\n for (const section of sections) {\n recordSectionDiagnostics(section, options);\n }\n return sections;\n },\n sliceStackAsync: async (runtimeMesh: RuntimeMesh | Mesh | SceneModelItem, planes: PlaneSectionSpec[], options: SliceOptions = {}) => {\n const mesh = runtimeMeshFrom(runtimeMesh).mesh;\n reportProgress(`Slicing ${planes.length} planes`, 42);\n const rawSections = intersectMeshWithPlaneStack(mesh, planes, options);\n reportProgress(`Generated ${rawSections.length} raw sections`, 52);\n const sections = options.connect === false\n ? rawSections\n : await connectSections(rawSections, options);\n for (const section of sections) {\n recordSectionDiagnostics(section, options);\n }\n return sections;\n },\n sliceStackParallel: async (runtimeMesh: RuntimeMesh | Mesh | SceneModelItem, planes: PlaneSectionSpec[], options: SliceOptions = {}) => {\n const mesh = runtimeMeshFrom(runtimeMesh).mesh;\n reportProgress(`Slicing ${planes.length} planes`, 42);\n const rawSections = intersectMeshWithPlaneStack(mesh, planes, options);\n reportProgress(`Generated ${rawSections.length} raw sections`, 52);\n const sections = options.connect === false\n ? rawSections\n : await connectSections(rawSections, options);\n for (const section of sections) {\n recordSectionDiagnostics(section, options);\n }\n return sections;\n },\n sliceAlong: async (runtimeMesh: RuntimeMesh | Mesh | SceneModelItem, rail: Parameters<typeof railPlanes>[0], options: SliceOptions = {}) => {\n const planes = railPlanes(rail);\n const mesh = runtimeMeshFrom(runtimeMesh).mesh;\n reportProgress(`Slicing ${planes.length} rail planes`, 42);\n const rawSections = intersectMeshWithPlaneStack(mesh, planes, options);\n reportProgress(`Generated ${rawSections.length} raw rail sections`, 52);\n const sections = options.connect === false\n ? rawSections\n : await connectSections(rawSections, options);\n for (const section of sections) {\n recordSectionDiagnostics(section, options);\n }\n return sections;\n },\n sparseInfill: (\n sections: Section[],\n layerIndex: number,\n options: {\n angle?: number;\n density?: number;\n field?: FillField;\n layerHeight?: number;\n lineWidth?: number;\n margin?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n solidLayers?: number;\n spacing?: number;\n } = {},\n ) =>\n sparseInfillPaths(sections, layerIndex, {\n angle: options.angle,\n density: options.density ?? 0.18,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex: 0,\n lineWidth: options.lineWidth ?? 0.44,\n margin: options.margin,\n onDiagnostic: recordToolpathDiagnostic,\n pattern: options.pattern,\n solidLayers: options.solidLayers,\n spacing: options.spacing,\n }),\n bottomSolidFill: (\n sections: Section[],\n layerIndex: number,\n options: {\n angle?: number;\n field?: FillField;\n layerHeight?: number;\n lineWidth?: number;\n margin?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n solidLayers?: number;\n } = {},\n ) =>\n bottomSolidFillPaths(sections, layerIndex, {\n angle: options.angle,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex: 0,\n lineWidth: options.lineWidth ?? 0.44,\n margin: options.margin,\n onDiagnostic: recordToolpathDiagnostic,\n pattern: options.pattern,\n solidLayers: options.solidLayers,\n }),\n topSolidFill: (\n sections: Section[],\n layerIndex: number,\n options: {\n angle?: number;\n field?: FillField;\n layerHeight?: number;\n lineWidth?: number;\n margin?: number;\n pattern?: \"concentric\" | \"grid\" | \"lines\" | \"monotonic\" | \"monotonicLine\" | \"rectilinear\" | \"triangles\";\n solidLayers?: number;\n } = {},\n ) =>\n topSolidFillPaths(sections, layerIndex, {\n angle: options.angle,\n field: options.field,\n layerHeight: options.layerHeight ?? 0.2,\n layerIndex: 0,\n lineWidth: options.lineWidth ?? 0.44,\n margin: options.margin,\n onDiagnostic: recordToolpathDiagnostic,\n pattern: options.pattern,\n solidLayers: options.solidLayers,\n }),\n toolpath: (printerInput: (Partial<PrinterProfile> & { printer?: Partial<PrinterProfile> }) = {}) => {\n const profile = {\n ...(printerInput.printer ?? printerInput),\n layerHeight: printerInput.layerHeight ?? printerInput.printer?.layerHeight,\n };\n lastGraph = createToolpathBuilder(defaultPrinter(profile));\n return lastGraph;\n },\n };\n\n const blockedGlobals = {\n document: undefined,\n fetch: undefined,\n globalThis: undefined,\n localStorage: undefined,\n sessionStorage: undefined,\n window: undefined,\n };\n\n const executable = new AsyncFunction(\n ...Object.keys(api),\n ...Object.keys(blockedGlobals),\n `\"use strict\";\\n${source}\\n//# sourceURL=main.fuse.js`,\n );\n\n reportProgress(\"Evaluating .fuse.js declarations\", 24);\n await executable(...Object.values(api), ...Object.values(blockedGlobals));\n reportProgress(mode === \"scene\" ? \"Preparing scene\" : \"Declarations evaluated\", mode === \"scene\" ? 84 : 32);\n\n if (mode !== \"scene\" && !exportedGraph && toolpathExportCallback) {\n reportProgress(\"Executing toolpath callback\", 36);\n exportedGraph = toGraph(await toolpathExportCallback());\n reportProgress(\"Toolpath graph generated\", 86);\n }\n\n const graph = exportedGraph ?? lastGraph?.toGraph();\n if (mode !== \"scene\" && !graph) {\n throw new Error(\"The .fuse.js program did not create or export a toolpath graph.\");\n }\n\n if (graph) {\n recordGraphWarnings(graph);\n }\n\n let gcode: string | undefined;\n if (mode === \"gcode\" && graph) {\n reportProgress(\"Generating G-code\", 90);\n gcode = legacyExportedGcode ?? gcodeExportCallback?.({ editGcode, generateGcode, graph }) ?? generateGcode(graph);\n }\n\n const generatedMessage = graph\n ? `generated ${graph.layers.length} layers`\n : `generated scene metadata with ${exportedScene?.items.length ?? 0} items`;\n\n return {\n diagnostics: [\n ...diagnostics,\n {\n level: \"info\",\n message: `Executed .fuse.js in ${mode} stage and ${generatedMessage} from ${source.split(\"\\n\").length} lines.`,\n },\n ],\n graph,\n gcode,\n hasGcodeExport: Boolean(gcodeExportCallback),\n hasToolpathExport: Boolean(exportedGraph || toolpathExportCallback || lastGraph),\n params,\n scene: exportedScene,\n stage: mode,\n };\n};\n", "import type { ToolpathGraph, ToolpathPath, ToolpathPoint, ToolpathRole } from \"./types\";\n\nexport type ToolpathBoundsSummary = {\n max: [number, number, number];\n min: [number, number, number];\n};\n\nexport type ToolpathPathSummary = {\n bounds: ToolpathBoundsSummary | null;\n closed: boolean;\n id: string;\n layerIndex: number;\n lengthMm: number;\n pointCount: number;\n primitive: \"line\" | \"segments\";\n role: ToolpathRole;\n sampledPoints: Array<[number, number, number]>;\n speed: number;\n z: number;\n};\n\nexport type ToolpathLayerSummary = {\n bounds: ToolpathBoundsSummary | null;\n index: number;\n lengthMm: number;\n pathCount: number;\n paths: ToolpathPathSummary[];\n pointCount: number;\n roleCounts: Partial<Record<ToolpathRole, number>>;\n roleLengths: Partial<Record<ToolpathRole, number>>;\n z: number;\n};\n\nexport type ToolpathSnapshotSummary = {\n bounds: ToolpathBoundsSummary | null;\n layerCount: number;\n layers: ToolpathLayerSummary[];\n pathCount: number;\n pointCount: number;\n roleCounts: Partial<Record<ToolpathRole, number>>;\n roleLengths: Partial<Record<ToolpathRole, number>>;\n stats: ToolpathGraph[\"stats\"];\n units: ToolpathGraph[\"units\"];\n zRange: [number, number] | null;\n};\n\nconst emptyBounds = (): ToolpathBoundsSummary => ({\n max: [-Infinity, -Infinity, -Infinity],\n min: [Infinity, Infinity, Infinity],\n});\n\nconst finiteBounds = (bounds: ToolpathBoundsSummary): ToolpathBoundsSummary | null =>\n bounds.min.every(Number.isFinite) && bounds.max.every(Number.isFinite) ? bounds : null;\n\nconst expandBounds = (bounds: ToolpathBoundsSummary, point: ToolpathPoint) => {\n bounds.min[0] = Math.min(bounds.min[0], point.x);\n bounds.min[1] = Math.min(bounds.min[1], point.y);\n bounds.min[2] = Math.min(bounds.min[2], point.z);\n bounds.max[0] = Math.max(bounds.max[0], point.x);\n bounds.max[1] = Math.max(bounds.max[1], point.y);\n bounds.max[2] = Math.max(bounds.max[2], point.z);\n};\n\nconst mergeBounds = (target: ToolpathBoundsSummary, source: ToolpathBoundsSummary | null) => {\n if (!source) return;\n expandBounds(target, { x: source.min[0], y: source.min[1], z: source.min[2] });\n expandBounds(target, { x: source.max[0], y: source.max[1], z: source.max[2] });\n};\n\nconst distance = (a: ToolpathPoint, b: ToolpathPoint) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dz = b.z - a.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n};\n\nconst pathLength = (path: ToolpathPath) => {\n const points = path.points;\n if (points.length < 2) return 0;\n\n if (path.primitive === \"segments\") {\n let length = 0;\n for (let index = 0; index + 1 < points.length; index += 2) {\n length += distance(points[index], points[index + 1]);\n }\n return length;\n }\n\n let length = 0;\n for (let index = 1; index < points.length; index += 1) {\n length += distance(points[index - 1], points[index]);\n }\n if (path.closed && points.length > 2) {\n length += distance(points.at(-1)!, points[0]);\n }\n return length;\n};\n\nconst incrementRole = (\n target: Partial<Record<ToolpathRole, number>>,\n role: ToolpathRole,\n amount = 1,\n) => {\n target[role] = (target[role] ?? 0) + amount;\n};\n\nconst samplePoints = (points: ToolpathPoint[], maxPoints: number): Array<[number, number, number]> => {\n if (points.length <= maxPoints) return points.map((point) => [point.x, point.y, point.z]);\n if (maxPoints <= 1) return [[points[0].x, points[0].y, points[0].z]];\n\n const sampled: Array<[number, number, number]> = [];\n const lastIndex = points.length - 1;\n for (let index = 0; index < maxPoints; index += 1) {\n const sourceIndex = Math.round((index / (maxPoints - 1)) * lastIndex);\n const point = points[sourceIndex];\n sampled.push([point.x, point.y, point.z]);\n }\n return sampled;\n};\n\nexport const summarizeToolpathGraph = (\n graph: ToolpathGraph,\n options: { maxSampledPointsPerPath?: number } = {},\n): ToolpathSnapshotSummary => {\n const maxSampledPointsPerPath = options.maxSampledPointsPerPath ?? 48;\n const graphBounds = emptyBounds();\n const graphRoleCounts: Partial<Record<ToolpathRole, number>> = {};\n const graphRoleLengths: Partial<Record<ToolpathRole, number>> = {};\n let graphPointCount = 0;\n\n const layers = graph.layers.map((layer): ToolpathLayerSummary => {\n const layerBounds = emptyBounds();\n const layerRoleCounts: Partial<Record<ToolpathRole, number>> = {};\n const layerRoleLengths: Partial<Record<ToolpathRole, number>> = {};\n let layerLength = 0;\n let layerPointCount = 0;\n\n const paths = layer.paths.map((path): ToolpathPathSummary => {\n const bounds = emptyBounds();\n for (const point of path.points) expandBounds(bounds, point);\n\n const lengthMm = pathLength(path);\n const pathBounds = finiteBounds(bounds);\n mergeBounds(layerBounds, pathBounds);\n incrementRole(layerRoleCounts, path.role);\n incrementRole(layerRoleLengths, path.role, lengthMm);\n layerLength += lengthMm;\n layerPointCount += path.points.length;\n\n return {\n bounds: pathBounds,\n closed: path.closed,\n id: path.id,\n layerIndex: path.layerIndex,\n lengthMm,\n pointCount: path.points.length,\n primitive: path.primitive ?? \"line\",\n role: path.role,\n sampledPoints: samplePoints(path.points, maxSampledPointsPerPath),\n speed: path.speed,\n z: path.z,\n };\n });\n\n const layerBoundsSummary = finiteBounds(layerBounds);\n mergeBounds(graphBounds, layerBoundsSummary);\n for (const [role, count] of Object.entries(layerRoleCounts)) {\n incrementRole(graphRoleCounts, role as ToolpathRole, count);\n }\n for (const [role, length] of Object.entries(layerRoleLengths)) {\n incrementRole(graphRoleLengths, role as ToolpathRole, length);\n }\n graphPointCount += layerPointCount;\n\n return {\n bounds: layerBoundsSummary,\n index: layer.index,\n lengthMm: layerLength,\n pathCount: layer.paths.length,\n paths,\n pointCount: layerPointCount,\n roleCounts: layerRoleCounts,\n roleLengths: layerRoleLengths,\n z: layer.z,\n };\n });\n\n const zValues = graph.layers.map((layer) => layer.z).filter(Number.isFinite);\n\n return {\n bounds: finiteBounds(graphBounds),\n layerCount: graph.layers.length,\n layers,\n pathCount: graph.stats.pathCount,\n pointCount: graphPointCount,\n roleCounts: graphRoleCounts,\n roleLengths: graphRoleLengths,\n stats: graph.stats,\n units: graph.units,\n zRange: zValues.length > 0 ? [Math.min(...zValues), Math.max(...zValues)] : null,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Clipper2ZFactory", "resolve", "module", "typeConverters", "handle", "classType", "getterReturnType", "desc", "setterArgumentType", "argTypes", "access", "mkdir", "readFile", "writeFile", "basename", "dirname", "resolve", "relative", "axis", "roleSpeed", "lines", "rings", "DEFAULT_AREA_EPSILON", "DEFAULT_DISTANCE_EPSILON", "outer", "DEFAULT_EPSILON", "distance", "distance2", "samePoint", "distance", "fallbackXAxis", "distance", "normalAt", "distance", "bucket", "distance", "edgeVertexIds", "distanceSquared2", "bucket", "distanceSquared", "distance", "DEFAULT_AREA_EPSILON", "DEFAULT_DISTANCE_EPSILON", "toPoint3", "dot3", "sub3", "relative", "hole", "distance", "distance2", "samePoint2", "region", "distance", "fail", "lastPoint", "flattenPaths", "distance", "points", "pathSegments", "shouldExtrude", "distance", "flattenPaths", "distance", "resolve", "MAX_WORKERS", "createWorker", "workerCountFor", "resolve", "tuple3", "flattenPaths", "layerIndex", "z", "paths", "distance", "mode", "graph", "emptyBounds", "distance", "length", "dirname", "resolve", "mkdir", "access", "readFile", "writeFile", "url", "basename", "writeFile", "readFile", "resolve", "header"]
|
|
7
|
+
}
|