diff --git a/CHANGELOG.md b/CHANGELOG.md index b79e479..9d46ee2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ - Performance: register reading-mode `3d`/`3dgrid` code blocks through lightweight lazy handlers so heavy inline preview modules load only when a rendered block needs them. - Performance: serialize Live Preview and reading-mode model loads through an inline preview queue and defer `3dgrid` model preparation until the grid enters the viewport, reducing startup and multi-model I/O spikes. - Performance: defer Live Preview runtime imports for preview backends, annotation managers, conversion preparation, and load feedback until a visible embed actually starts loading. -- Performance: register Live Preview embeds through a lightweight lazy widget so workspace startup no longer imports the full embed runtime before a model embed mounts. +- Performance: register Live Preview embeds through a lightweight lazy widget so workspace startup no longer imports the full embed runtime before a model embed approaches the viewport. - Performance: lazy-load the full settings tab UI and model import modal so normal workspace startup only registers lightweight entry points. - Performance: combine model profile normalization and compact-state change detection into one pass, reducing startup work for large `data.json` registered-part lists. - Performance: reuse already-normalized registered part arrays while loading model profiles, avoiding repeated object allocation for compact `data.json` state. diff --git a/main.js b/main.js index b9debd9..7b65903 100644 --- a/main.js +++ b/main.js @@ -24616,5 +24616,5 @@ ${e.trim()} `),"",`# ${n.baseName} Knowledge Index`,"","## User Notes","","- ","",e].join(` `)}async function PEe(n){let e=typeof performance!="undefined"?performance.now():Date.now(),t=n.app.vault.getAbstractFileByPath(n.indexPath),i=null;if(t instanceof Rl.TFile){let r=await n.app.vault.read(t),s=Zw(n);await n.app.vault.modify(t,MQ(r,s)),i=t}else i=await xQ(n.app,n.indexPath,IQ(n));return i&&(n.analysis.knowledgeIndexPath=i.path),n.analysis.pipeline.push({stage:"index",durationMs:Math.max(0,Math.round((typeof performance!="undefined"?performance.now():Date.now())-e)),status:i?"success":"failed"}),i}async function DEe(n,e,t={}){var o,l,c,f,d,h,u,m,_,p,g;if(kw!==null)return;let i;kw=new Promise(v=>{i=v});let r=null,s=null,a=0;try{let v=e.store.getState(),x=v.currentModelPath;if(!x)return;let T=v.modelAssetProfiles[x],E=v.modelPreview,S=Qr(x)||"model",R=v.settings.reportFolder,b=`${R}/${S} Report.md`,I=`${R}/${S} Analysis.json`,C=`${R}/${S} Index.md`,D=((o=v.lastKnowledgeGeneration)==null?void 0:o.status)==="pending"?`Previous knowledge generation for ${v.lastKnowledgeGeneration.modelPath} did not complete. This run can replace the pending marker if it finishes.`:null;D&&new Rl.Notice(D),r=Vw({modelPath:x,reportNotePath:b,analysisSidecarPath:I,knowledgeIndexPath:C,status:"pending"}),e.setLastKnowledgeGeneration(r);let O=(f=(c=(l=t.preview)==null?void 0:l.getModelEvidence)==null?void 0:c.call(l))!=null?f:null,V=await AEe(n,t.preview,v.settings.previewFolder,S);a=V.paths.length;let N=await bQ(n,v.modelAssetProfiles,x);s=i0({modelPath:x,profile:T,preview:E,evidence:O,previewImages:V.paths,registeredParts:N}),D&&(s.warnings=[...s.warnings,D]);let F=s;V.warning&&(F.warnings=[...F.warnings,V.warning],F.draftingInput&&(F.draftingInput={...F.draftingInput,evidence:{...F.draftingInput.evidence,warnings:[...F.draftingInput.evidence.warnings,V.warning]}})),F.localDraft=TQ({baseName:S,sourcePath:x,profile:T,preview:E,analysis:F}),F.pipeline.push({stage:"draft",durationMs:0,status:"success"}),await CEe({app:n,partFolder:v.settings.partFolder,baseName:S,notePath:b,sourcePath:x,analysis:F}),F.draftingInput&&(F.draftingInput={...F.draftingInput,partCandidates:F.draftingInput.partCandidates.map(X=>{let K=F.parts.find(ge=>ge.partId===X.partId);return K!=null&&K.notePath?{...X,notePath:K.notePath}:X}),annotationLinks:[...(d=F.annotationLinks)!=null?d:[]]});let B=iQ(v.settings,F.draftingInput,Pp);if(B.enabled)try{let X=await rQ(B);X?(F.remoteDraft=X,F.pipeline.push({stage:"remoteDraft",durationMs:0,status:"success"})):F.pipeline.push({stage:"remoteDraft",durationMs:0,status:"skipped"})}catch(X){let K=X instanceof Error?X.message:String(X);F.warnings=[...F.warnings,`Remote draft failed: ${K}`],F.pipeline.push({stage:"remoteDraft",durationMs:0,status:"failed"})}else F.pipeline.push({stage:"remoteDraft",durationMs:0,status:"skipped"});if(await jw(n,R),!await PEe({app:n,baseName:S,notePath:b,sourcePath:x,analysisSidecarPath:I,indexPath:C,analysis:F,preview:E,profile:T}))throw new Error(`Unable to write knowledge index: ${C}`);let J=AQ({baseName:S,notePath:b,sourcePath:x,profile:T,preview:E,analysis:F,analysisSidecarPath:I,knowledgeIndexPath:F.knowledgeIndexPath});if(!await aQ(n,I,`${JSON.stringify(F,null,2)} `))throw new Error(`Unable to write analysis sidecar: ${I}`);let te=await aQ(n,b,J);if(!te)throw new Error(`Unable to write knowledge report: ${b}`);e.updateModelProfile(x,X=>({analysisVersion:Pp,registeredParts:F.parts.map(qw),reportNotePath:te.path,analysisSidecarPath:I,knowledgeIndexPath:F.knowledgeIndexPath,previewImagePaths:V.paths})),e.setLastKnowledgeGeneration(Vw({modelPath:x,reportNotePath:te.path,analysisSidecarPath:I,knowledgeIndexPath:F.knowledgeIndexPath,partNoteCount:(u=(h=F.partNotePaths)==null?void 0:h.length)!=null?u:0,previewImageCount:F.previewImages.length,status:"success",warningCount:F.warnings.length})),await n.workspace.getLeaf(!0).openFile(te,{active:!0}),new Rl.Notice(`Knowledge note updated: ${te.path}`)}catch(v){throw r&&e.setLastKnowledgeGeneration(Vw({...r,partNoteCount:(_=(m=s==null?void 0:s.partNotePaths)==null?void 0:m.length)!=null?_:0,previewImageCount:(p=s==null?void 0:s.previewImages.length)!=null?p:a,status:"failed",warningCount:Math.max(1,(g=s==null?void 0:s.warnings.length)!=null?g:0)})),v}finally{i(),kw=null}}var Rl,Jve,dQ,eEe,hQ,uQ,mQ,pQ,Ww,kw,_0=y(()=>{"use strict";Rl=require("obsidian");MT();TT();bn();vs();Aw();nQ();Jve=Hi("knowledge-note"),dQ=8,eEe=256,hQ=64,uQ=32,mQ=16,pQ="",Ww="";kw=null});var wQ={};Ue(wQ,{DirectModelView:()=>Qw});function VEe(n){return n instanceof Error&&n.message.includes("Missing external model resource:")}function PQ(n){var i,r,s;let e=(r=(i=n.occurrenceId)!=null?i:n.componentId)!=null?r:n.partNumber;if(e!=null&&e.trim())return`component:${e.trim().toLowerCase()}`;let t=n.meshRefs.map(a=>a.trim().toLowerCase()).filter(Boolean).sort().join("|");return`${(s=n.source)!=null?s:"mesh"}:${n.name.trim().toLowerCase()}:${t}`}function GEe(n,e){return n?{...e,notePath:n.notePath,reviewed:n.reviewed,inferredFunctions:n.inferredFunctions.length>0?n.inferredFunctions:e.inferredFunctions,knowledgeTags:n.knowledgeTags.length>0?n.knowledgeTags:e.knowledgeTags}:e}function DQ(n){return n.reviewed||n.notePath?0:n.source==="component"?1:n.source==="group"?2:n.source==="detail-cluster"?3:4}function kEe(n){return n.length<=yQ?n:[...n].sort((e,t)=>{var s,a,o,l;let i=DQ(e)-DQ(t);if(i!==0)return i;let r=((s=t.confidence)!=null?s:0)-((a=e.confidence)!=null?a:0);return r!==0?r:((o=t.childCount)!=null?o:0)-((l=e.childCount)!=null?l:0)}).slice(0,yQ)}function LQ(n){return{partId:n.partId,assetId:n.assetId,parentPartId:n.parentPartId,name:n.name,source:n.source,componentId:n.componentId,occurrenceId:n.occurrenceId,partNumber:n.partNumber,componentPath:n.componentPath,category:n.category,meshRefs:n.meshRefs,childCount:n.childCount,materialRefs:n.materialRefs,bbox:n.bbox,center:n.center,triangleCount:n.triangleCount,vertexCount:n.vertexCount,materialName:n.materialName,sourceFormat:n.sourceFormat,effectiveFormat:n.effectiveFormat,loadStrategy:n.loadStrategy,confidence:n.confidence,observations:n.observations,inferredFunctions:n.inferredFunctions,knowledgeTags:n.knowledgeTags,notePath:n.notePath,reviewed:n.reviewed}}function WEe(n=[],e=[]){return n.length!==e.length?!1:JSON.stringify(n.map(LQ))===JSON.stringify(e.map(LQ))}function NQ(n){return n==="extreme"?3:n==="heavy"?2:n==="medium"?1:0}function HEe(n){let e=NQ(n.performanceTier);return e>=2?NEe:e===1?OEe:LEe}function zEe(n){return NQ(n.performanceTier)<2&&n.meshCount<=wEe&&n.triangleCount<=FEe}function OQ(n){return n.source==="component"?0:n.source==="group"?1:n.source==="detail-cluster"?2:3}function XEe(n){return n.parts.length<=CQ?n:{...n,parts:[...n.parts].sort((e,t)=>{var s,a;let i=OQ(e)-OQ(t);if(i!==0)return i;let r=((s=t.childCount)!=null?s:0)-((a=e.childCount)!=null?a:0);return r!==0?r:t.triangleCount-e.triangleCount}).slice(0,CQ)}}function YEe(n,e){return e.performanceTier==="extreme"?{renderQuality:"low",renderScale:Math.min(n.renderScale,.65)}:e.performanceTier==="heavy"?{renderQuality:n.renderQuality==="low"?"low":"medium",renderScale:Math.min(n.renderScale,.85)}:e.performanceTier==="medium"?{renderQuality:n.renderQuality,renderScale:Math.min(n.renderScale,1)}:{renderQuality:n.renderQuality,renderScale:n.renderScale}}function KEe(n){return{sourcePath:n.sourcePath,sourceFormat:Dp(n.sourceExt||n.sourcePath),effectiveFormat:Dp(n.ext||n.path),loadStrategy:n.strategy}}function jEe(n,e,t=[]){if(!e&&t.length===0)return n;let i=e!=null?e:n.formatLineage,r=Array.from(new Set([...n.resourceWarnings,...t]));return{...n,formatLineage:i,resourceWarnings:r,parts:n.parts.map(s=>{var a,o,l;return{...s,sourceFormat:(a=s.sourceFormat)!=null?a:i==null?void 0:i.sourceFormat,effectiveFormat:(o=s.effectiveFormat)!=null?o:i==null?void 0:i.effectiveFormat,loadStrategy:(l=s.loadStrategy)!=null?l:i==null?void 0:i.loadStrategy}})}}var Fc,g0,LEe,OEe,NEe,yQ,wEe,FEe,CQ,BEe,UEe,Qw,FQ=y(()=>{"use strict";Fc=require("obsidian");$v();Gb();uw();Qb();_w();vs();$b();yv();Jb();Mp();gn();Dv();ia();bn();Aw();TZ();CZ();DZ();NZ();Xv();V0();g0=Hi("direct-view"),LEe=450,OEe=1200,NEe=1500,yQ=256,wEe=500,FEe=15e5,CQ=64,BEe=512,UEe=".obsidian/ai-model-workbench/converted-assets";Qw=class extends Fc.FileView{constructor(t,i,r,s){super(t);this.preview=null;this.annotationMgr=null;this.annotationMode=!1;this.loadGeneration=0;this.escHandler=null;this.workbenchPanel=null;this.workbenchSummary=null;this.workbenchRoute=null;this.workbenchModelPath=null;this.workbenchEvidenceLineage=null;this.workbenchSourceWarnings=[];this.workbenchEvidenceModelPath=null;this.workbenchEvidence=null;this.evidenceRegistrationTimer=null;this.sidebarContent=null;this.getSettings=i,this.convertedAssetCache=r,this.ps=s}getViewType(){return ud}getDisplayText(){var t,i;return(i=(t=this.file)==null?void 0:t.name)!=null?i:j("workbench.modelTitle")}getIcon(){return"box"}async onOpen(){this.contentEl.empty(),this.contentEl.addClass("ai3d-direct-view"),this.file&&await this.loadModel(this.file)}async onLoadFile(t){this.contentEl.empty(),await this.loadModel(t)}onClose(){var t,i;return this.clearDeferredEvidenceRegistration(),this.escHandler&&(activeDocument.removeEventListener("keydown",this.escHandler),this.escHandler=null),(t=this.annotationMgr)==null||t.destroy(),this.annotationMgr=null,(i=this.preview)==null||i.destroy(),this.preview=null,Promise.resolve()}async loadModel(t){var v,x,T,E,S,R,b;let i=++this.loadGeneration,r=vr();this.clearDeferredEvidenceRegistration(),(v=this.annotationMgr)==null||v.destroy(),this.annotationMgr=null,this.workbenchPanel=null,this.workbenchSummary=null,this.workbenchRoute=null,this.workbenchModelPath=null,this.workbenchEvidenceLineage=null,this.workbenchSourceWarnings=[],this.workbenchEvidenceModelPath=null,this.workbenchEvidence=null,this.sidebarContent=null,(x=this.preview)==null||x.destroy(),this.preview=null,this.ps.setCurrentModel(t.path,null);let{workspace:s,topTrack:a,mainArea:o,hHandle:l,host:c,canvas:f,modeOverlay:d,sidebarContent:h,vHandle:u,workbenchPanel:m}=yZ({contentEl:this.contentEl,filePath:t.path,mobile:r,getPreview:()=>this.preview}),_=null,p=I=>{var C;this.annotationMode=I,r&&I&&(_==null||_.setMobileInteractionMode(!0)),(C=this.annotationMgr)==null||C.hideEditor(),d.classList.toggle("is-hidden",!I)};this.escHandler&&activeDocument.removeEventListener("keydown",this.escHandler),this.escHandler=I=>{I.key==="Escape"&&this.annotationMode&&p(!1)},activeDocument.addEventListener("keydown",this.escHandler),_=xv(o,c,this.app,()=>this.preview,()=>t.path,()=>{this.leaf.detach()},this.getSettings,()=>(p(!this.annotationMode),this.annotationMode),I=>{!I&&this.annotationMode&&p(!1)}),this.sidebarContent=h,this.workbenchPanel=m,this.setupResizeHandles(l,u,a,s);let g=Ch(c);try{let I=this.getSettings(),C=(T=Ka(this.app,t.path))!=null?T:void 0,D=(E=Ka(this.app,UEe))!=null?E:void 0;g.setPhaseKey("loading.preparingModel");let O=await Ip({path:t.path,absolutePath:C,preferConversionExts:yp(I),conversionManager:async()=>{let{createConversionManager:$}=await Promise.resolve().then(()=>(m0(),u0));return $(I)},convertedAssetCache:this.convertedAssetCache,conversionOutputRoot:D});if(i!==this.loadGeneration){new Fc.Notice(j("directWorkbench.modelLoadInterrupted"));return}let V=Mv(O);this.workbenchEvidenceLineage=KEe(V),this.workbenchSourceWarnings=[...V.warnings];let N=OZ(I,V);_==null||_.syncCapabilities(),g.setPhaseKey("loading.loadingModel");let F=ja(this.app,V.path);F.catch(()=>{});let B=await this.createPreviewWithFallback(f,F,V,N,t.path,I);if(i!==this.loadGeneration){B.preview.destroy(),new Fc.Notice(j("directWorkbench.modelLoadInterrupted"));return}this.preview=B.preview,c.dataset.ai3dBackend=B.route.backend,c.dataset.ai3dRouteReason=B.route.reason,_==null||_.syncCapabilities();let G=B.summary;this.applyLargeModelRenderBudget(B.preview,I,G),Pv(c,G),this.workbenchPanel=m,this.workbenchSummary=G,this.workbenchRoute=B.route,this.workbenchModelPath=t.path,this.renderWorkbenchPanel(m,G,B.route,t.path),this.renderSidebarContent(t.path,G),this.ps.setCurrentModel(t.path,G),g0.info("direct view model loaded",{path:t.path,effectivePath:V.path,effectiveExt:V.ext,strategy:V.strategy,backend:B.route.backend,routeReason:B.route.reason,meshCount:G.meshCount,triangleCount:G.triangleCount}),g.setProgress(100);let J=this.preview.getAnnotationProvider();if(J.canvas){let $=this.ps.store.getState().modelAssetProfiles[t.path],te=(S=$==null?void 0:$.annotations)!=null?S:[],X=Iv(this.app),K=gw(this.app);this.annotationMgr=new pd(J,c,"edit",te,ge=>{this.ps.updateModelProfile(t.path,Re=>({annotations:ge})),_.updateAnnotationBadge(ge.length)},X,K,{app:this.app,previewMode:this.getSettings().annotationPreviewMode,displayMode:this.getSettings().annotationDisplayMode}),_.showAnnotateButton(),_.updateAnnotationBadge(te.length),this.preview.onPick(ge=>{var me,ne;if(!this.annotationMode||!this.annotationMgr)return;let Re=ge.screenX,Be=ge.screenY,ae=(ne=(me=this.preview)==null?void 0:me.getPickWorldPoint(ge))!=null?ne:null;ae&&this.annotationMgr.showEditor(Re,Be,ae)})}g.hide(),this.scheduleDeferredEvidenceRegistration(t.path,i,G)}catch(I){if(i!==this.loadGeneration)return;g.hide(),(R=this.preview)==null||R.destroy(),this.preview=null,c.replaceChildren(),(b=this.workbenchPanel)==null||b.addClass("is-hidden");let C=bv(I);Rv(I)?console.warn("[AI3D] Direct view blocked by converter settings:",C.message):console.error("[AI3D] Direct view failed:",I),this.ps.store.getState().currentModelPath===t.path&&this.ps.clearModelPreview(),Cv(c,C)}finally{g.hide()}}registerModelPartsFromEvidence(t,i){var c,f;if(!(i!=null&&i.parts.length))return;let r=Tw(t,i.parts,i.formatLineage);if(r.length===0)return;let a=(c=this.ps.store.getState().modelAssetProfiles[t])!=null?c:U0(),o=new Map(((f=a.registeredParts)!=null?f:[]).map(d=>[PQ(d),d])),l=kEe(r.map(d=>GEe(o.get(PQ(d)),d)));WEe(a.registeredParts,l)||this.ps.updateModelProfile(t,d=>({registeredParts:l}))}clearDeferredEvidenceRegistration(){this.evidenceRegistrationTimer!==null&&(window.clearTimeout(this.evidenceRegistrationTimer),this.evidenceRegistrationTimer=null)}scheduleDeferredEvidenceRegistration(t,i,r){if(this.clearDeferredEvidenceRegistration(),!zEe(r)){this.workbenchEvidenceModelPath=t,this.workbenchEvidence=null,this.refreshWorkbenchPanel(),g0.info("skip automatic evidence capture for very large model",{modelPath:t,performanceTier:r.performanceTier,meshCount:r.meshCount,triangleCount:r.triangleCount});return}this.evidenceRegistrationTimer=window.setTimeout(()=>{if(this.evidenceRegistrationTimer=null,!(i!==this.loadGeneration||this.workbenchModelPath!==t))try{let s=this.getCurrentModelEvidence();this.registerModelPartsFromEvidence(t,s),i===this.loadGeneration&&this.workbenchModelPath===t&&this.refreshWorkbenchPanel()}catch(s){console.warn("[AI3D] Deferred model evidence capture failed:",s)}},HEe(r))}getCurrentModelEvidence(){var s,a,o;let t=this.workbenchModelPath;if(t&&this.workbenchEvidenceModelPath===t)return this.workbenchEvidence;let i=(o=(a=(s=this.preview)==null?void 0:s.getModelEvidence)==null?void 0:a.call(s))!=null?o:null,r=i?jEe(i,this.workbenchEvidenceLineage,this.workbenchSourceWarnings):null;return t&&(this.workbenchEvidenceModelPath=t,this.workbenchEvidence=r),r}getCachedModelEvidence(t){return this.workbenchEvidenceModelPath===t?this.workbenchEvidence:null}createKnowledgePreviewAdapter(){return this.preview?{captureSnapshot:()=>{var t,i;return(i=(t=this.preview)==null?void 0:t.captureSnapshot())!=null?i:null},getModelEvidence:()=>this.getCurrentModelEvidence()}:null}renderWorkbenchPanel(t,i,r,s){var a,o;PZ({panel:t,summary:i,route:r,registeredPartCount:(o=(a=this.ps.store.getState().modelAssetProfiles[s])==null?void 0:a.registeredParts)==null?void 0:o.length})}renderSidebarContent(t,i){this.sidebarContent&&(this.sidebarContent.empty(),this.renderKnowledgeControls(this.sidebarContent,t),this.renderRegisteredPartMatches(this.sidebarContent,t,i))}refreshWorkbenchPanel(){!this.workbenchPanel||!this.workbenchSummary||!this.workbenchRoute||!this.workbenchModelPath||(this.renderWorkbenchPanel(this.workbenchPanel,this.workbenchSummary,this.workbenchRoute,this.workbenchModelPath),this.renderSidebarContent(this.workbenchModelPath,this.workbenchSummary))}setupResizeHandles(t,i,r,s){let a=(c,f,d)=>{let h=0,u=0,m=p=>{f(p.clientX-h,p.clientY-u),h=p.clientX,u=p.clientY},_=()=>{activeDocument.removeEventListener("mousemove",m),activeDocument.removeEventListener("mouseup",_),d()};c.addEventListener("mousedown",p=>{p.preventDefault(),h=p.clientX,u=p.clientY,activeDocument.addEventListener("mousemove",m),activeDocument.addEventListener("mouseup",_)})},o=200;a(t,c=>{o=Math.max(48,Math.min(400,o-c)),r.style.gridTemplateColumns=`1fr 4px ${o}px`},()=>{});let l=220;a(i,(c,f)=>{l=Math.max(120,Math.min(500,l-f)),s.style.gridTemplateRows=`1fr 4px ${l}px`},()=>{})}renderKnowledgeControls(t,i){let r=this.ps.store.getState().modelAssetProfiles[i],s=t.createDiv({cls:"ai3d-direct-workbench-control ai3d-direct-workbench-knowledge"});s.createDiv({cls:"ai3d-direct-workbench-label",text:j("directWorkbench.knowledgeTitle")}),s.createDiv({cls:"ai3d-direct-workbench-value",text:r!=null&&r.knowledgeIndexPath?j("workbench.indexReady"):r!=null&&r.reportNotePath?j("workbench.noteReady"):j("workbench.noReportYet")});let a=s.createDiv({cls:"ai3d-direct-workbench-actions"}),o=a.createEl("button",{cls:"ai3d-direct-workbench-action",text:j("workbench.generateNoteAction"),attr:{type:"button","data-ai3d-action":"generate-note"}});o.addEventListener("click",()=>{o.disabled=!0,Promise.resolve().then(()=>(_0(),p0)).then(({generateKnowledgeNote:f})=>f(this.app,this.ps,{preview:this.createKnowledgePreviewAdapter()})).catch(f=>{console.error("[AI3D] Generate knowledge note failed:",f)}).finally(()=>{o.disabled=!1,this.refreshWorkbenchPanel()})});let l=a.createEl("button",{cls:"ai3d-direct-workbench-action",text:j("workbench.openNoteAction"),attr:{type:"button","data-ai3d-action":"open-note"}});l.disabled=!(r!=null&&r.reportNotePath),l.addEventListener("click",()=>{var h;let f=(h=this.ps.store.getState().modelAssetProfiles[i])==null?void 0:h.reportNotePath;if(!f)return;let d=this.app.vault.getAbstractFileByPath(f);d instanceof Fc.TFile&&this.app.workspace.getLeaf(!0).openFile(d,{active:!0})});let c=a.createEl("button",{cls:"ai3d-direct-workbench-action",text:j("workbench.openIndexAction"),attr:{type:"button","data-ai3d-action":"open-index"}});c.disabled=!(r!=null&&r.knowledgeIndexPath),c.addEventListener("click",()=>{var h;let f=(h=this.ps.store.getState().modelAssetProfiles[i])==null?void 0:h.knowledgeIndexPath;if(!f)return;let d=this.app.vault.getAbstractFileByPath(f);d instanceof Fc.TFile&&this.app.workspace.getLeaf(!0).openFile(d,{active:!0})})}renderRegisteredPartMatches(t,i,r){let s=this.loadGeneration,a=t.createDiv({cls:"ai3d-direct-workbench-control ai3d-direct-workbench-registered"}),o=a.createDiv({cls:"ai3d-direct-workbench-control-head"});o.createSpan({cls:"ai3d-direct-workbench-label",text:j("directWorkbench.registeredTitle")});let l=o.createSpan({cls:"ai3d-direct-workbench-value",text:j("directWorkbench.registeredLoading")}),c=a.createDiv({cls:"ai3d-direct-workbench-registered-body"}),f=u=>{l.setText(""),c.empty(),c.createDiv({cls:"ai3d-direct-workbench-empty",text:j(u)})},d=this.getCachedModelEvidence(i),h=d?XEe(d):null;if(!(h!=null&&h.parts.length)){this.workbenchEvidenceModelPath===i?f("directWorkbench.registeredUnavailable"):c.createDiv({cls:"ai3d-direct-workbench-empty",text:j("directWorkbench.registeredLoading")});return}Promise.resolve().then(()=>(_0(),p0)).then(async({collectRegisteredPartsFromProfiles:u})=>{var T;let m=this.ps.store.getState(),_=await u(this.app,m.modelAssetProfiles,i,{includeSidecars:!1,maxParts:BEe});if(s!==this.loadGeneration||this.workbenchModelPath!==i||!a.isConnected)return;if(_.length===0){f("directWorkbench.registeredEmpty");return}let p=this.ps.store.getState().modelAssetProfiles[i],v=i0({modelPath:i,profile:p,preview:r,evidence:h,registeredParts:_}).parts.filter(E=>{var S;return(S=E.registeredMatches)==null?void 0:S.length}).sort((E,S)=>{var R,b,I,C,D,O;return((I=(b=(R=S.registeredMatches)==null?void 0:R[0])==null?void 0:b.matchScore)!=null?I:0)-((O=(D=(C=E.registeredMatches)==null?void 0:C[0])==null?void 0:D.matchScore)!=null?O:0)}).slice(0,5);if(v.length===0){f("directWorkbench.registeredEmpty");return}l.setText(qi("directWorkbench.registeredCount",{count:String(v.length)})),c.empty();let x=c.createDiv({cls:"ai3d-direct-workbench-match-list"});for(let E of v){let S=(T=E.registeredMatches)==null?void 0:T[0];if(!S)continue;let b=SZ(x,E.name,S).querySelector("[data-ai3d-action='open-registered-part']");b instanceof HTMLButtonElement&&b.addEventListener("click",()=>{let I=b.getAttribute("data-ai3d-target-path")||void 0;if(!I)return;let C=this.app.vault.getAbstractFileByPath(I);C instanceof Fc.TFile&&this.app.workspace.getLeaf(!0).openFile(C,{active:!0})})}}).catch(u=>{console.warn("[AI3D] Registered part match preview failed:",u),s===this.loadGeneration&&this.workbenchModelPath===i&&a.isConnected&&f("directWorkbench.registeredUnavailable")})}async createPreviewWithFallback(t,i,r,s,a,o){let l=await Ap(g0,{surface:"direct-view",modelPath:a},t,s);this.applyConfiguredRenderQuality(l.preview,o);let c;try{c=await i}catch(f){throw l.preview.destroy(),f}try{let f=await l.preview.loadModel(c,r.ext,d=>ja(this.app,d),r.path);return{preview:l.preview,summary:f,route:l.route}}catch(f){if(l.preview.destroy(),l.route.backend!=="three"||!s.requireWorkbenchFeatures||!s.allowWorkbenchFeaturesOnThree)throw f;console.warn("[AI3D] Experimental Three workbench failed; falling back to Babylon:",f);let d={...s,allowWorkbenchFeaturesOnThree:!1},h=await Ap(g0,{surface:"direct-view-fallback",modelPath:a},t,d);this.applyConfiguredRenderQuality(h.preview,o);try{let u=await h.preview.loadModel(c,r.ext,m=>ja(this.app,m),r.path);return{preview:h.preview,summary:u,route:h.route}}catch(u){throw h.preview.destroy(),VEe(f)?f:u}}}applyConfiguredRenderQuality(t,i){var r;(r=t.setRenderQuality)==null||r.call(t,i.renderQuality,i.renderScale)}applyLargeModelRenderBudget(t,i,r){var a;let s=YEe(i,r);(a=t.setRenderQuality)==null||a.call(t,s.renderQuality,s.renderScale)}}});var UQ={};Ue(UQ,{AI3DSettingTab:()=>Jw});function qEe(){switch($w==null?void 0:$w.platform){case"win32":return{python:"Path to python executable",freecad:"Path to FreeCADCmd.exe",obj2gltf:"Path to obj2gltf.cmd",fbx2gltf:"Path to FBX2glTF.exe"};case"darwin":return{python:"Path to python3",freecad:"Path to FreeCADCmd",obj2gltf:"Path to obj2gltf",fbx2gltf:"Path to FBX2glTF"};case"linux":return{python:"Path to python3",freecad:"Path to freecadcmd",obj2gltf:"Path to obj2gltf",fbx2gltf:"Path to FBX2glTF"};default:return{python:"Path to python executable",freecad:"Path to FreeCAD command",obj2gltf:"Path to obj2gltf",fbx2gltf:"Path to FBX2glTF"}}}var qt,$w,Jw,VQ=y(()=>{"use strict";qt=require("obsidian");D0();gn();ia();fr();$w=Yv();Jw=class extends qt.PluginSettingTab{constructor(t,i){super(t,i);this.diagnosticsRunId=0;this.diagnosticsEl=null;this.plugin=i}display(){let{containerEl:t}=this;t.empty(),Hp(this.plugin.getSettings().locale),this.diagnosticsEl=null,this.addTitle(t),this.buildLanguageSection(t),this.buildFoldersSection(t),this.buildBehaviorSection(t),this.buildKnowledgeGenerationSection(t),this.buildConvertersSection(t),this.buildPerformanceSection(t)}addTitle(t){new qt.Setting(t).setName(j("settings.title")).setHeading()}createSecondaryMenu(t,i,r){let s=t.createEl("details",{cls:"ai3d-settings-secondary-menu"});s.createEl("summary",{cls:"ai3d-settings-secondary-menu-summary",text:i});let a=s.createDiv({cls:"ai3d-settings-secondary-menu-body"});return a.createEl("p",{cls:"setting-item-description",text:r}),a}resetCommandDiagnostics(){this.diagnosticsEl&&(this.diagnosticsRunId++,this.diagnosticsEl.empty(),this.diagnosticsEl.createEl("p",{text:j("settings.diagnostics.idle")}))}buildLanguageSection(t){new qt.Setting(t).setName(j("settings.language")).setHeading(),new qt.Setting(t).setName(j("settings.language")).setDesc(j("settings.language.desc")).addDropdown(i=>i.addOption("en","English").addOption("zh-CN","\u7B80\u4F53\u4E2D\u6587").setValue(this.plugin.getSettings().locale).onChange(r=>{this.plugin.updateSettings({locale:r}),this.display()}))}buildFoldersSection(t){new qt.Setting(t).setName(j("settings.folders")).setHeading(),new qt.Setting(t).setName(j("settings.sourceModelFolder")).setDesc(j("settings.sourceModelFolder.desc")).addText(i=>i.setPlaceholder(Gc.sourceModelFolder).setValue(this.plugin.getSettings().sourceModelFolder).onChange(r=>{this.plugin.updateSettings({sourceModelFolder:r})})),new qt.Setting(t).setName(j("settings.reportFolder")).setDesc(j("settings.reportFolder.desc")).addText(i=>i.setPlaceholder(Gc.reportFolder).setValue(this.plugin.getSettings().reportFolder).onChange(r=>{this.plugin.updateSettings({reportFolder:r})})),new qt.Setting(t).setName(j("settings.partFolder")).setDesc(j("settings.partFolder.desc")).addText(i=>i.setPlaceholder(Gc.partFolder).setValue(this.plugin.getSettings().partFolder).onChange(r=>{this.plugin.updateSettings({partFolder:r})})),new qt.Setting(t).setName(j("settings.snapshotFolder")).setDesc(j("settings.snapshotFolder.desc")).addText(i=>i.setPlaceholder(Gc.snapshotFolder).setValue(this.plugin.getSettings().snapshotFolder).onChange(r=>{this.plugin.updateSettings({snapshotFolder:r})}))}buildBehaviorSection(t){new qt.Setting(t).setName(j("settings.behavior")).setHeading(),new qt.Setting(t).setName(j("settings.autoGenerateKnowledgeNotes")).setDesc(j("settings.autoGenerateKnowledgeNotes.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().autoGenerateKnowledgeNotes).onChange(r=>{this.plugin.updateSettings({autoGenerateKnowledgeNotes:r})})),new qt.Setting(t).setName(j("settings.annotationPreviewMode")).setDesc(j("settings.annotationPreviewMode.desc")).addDropdown(i=>i.addOption("plain-text",j("settings.annotationPreviewMode.plainText")).addOption("markdown",j("settings.annotationPreviewMode.markdown")).setValue(this.plugin.getSettings().annotationPreviewMode).onChange(r=>{this.plugin.updateSettings({annotationPreviewMode:r})})),new qt.Setting(t).setName(j("settings.annotationDisplayMode")).setDesc(j("settings.annotationDisplayMode.desc")).addDropdown(i=>i.addOption("snippet",j("settings.annotationDisplayMode.snippet")).addOption("surface",j("settings.annotationDisplayMode.surface")).addOption("dot",j("settings.annotationDisplayMode.dot")).setValue(this.plugin.getSettings().annotationDisplayMode).onChange(r=>{this.plugin.updateSettings({annotationDisplayMode:r})})),new qt.Setting(t).setName(j("settings.previewRendererRollout")).setDesc(j("settings.previewRendererRollout.desc")).addDropdown(i=>i.addOption("babylon-safe",j("settings.previewRendererRollout.babylonSafe")).addOption("three-readonly-glb",j("settings.previewRendererRollout.readonly")).addOption("three-direct-glb",j("settings.previewRendererRollout.direct")).setValue(this.plugin.getSettings().previewRendererRollout).onChange(r=>{this.plugin.updateSettings({previewRendererRollout:r})})),new qt.Setting(t).setName(j("settings.useThreeRenderer")).setDesc(j("settings.useThreeRenderer.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().useThreeRenderer).onChange(r=>{this.plugin.updateSettings({useThreeRenderer:r})})),new qt.Setting(t).setName(j("settings.experimentalThreeWorkbench")).setDesc(j("settings.experimentalThreeWorkbench.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().experimentalThreeWorkbench).onChange(r=>{this.plugin.updateSettings({experimentalThreeWorkbench:r})})),new qt.Setting(t).setName(j("settings.autoRotateDefault")).setDesc(j("settings.autoRotateDefault.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().autoRotateDefault).onChange(r=>{this.plugin.updateSettings({autoRotateDefault:r})})),new qt.Setting(t).setName(j("settings.snapshotNaming")).setDesc(j("settings.snapshotNaming.desc")).addDropdown(i=>i.addOption("model-name",j("settings.snapshotNaming.modelName")).addOption("timestamp",j("settings.snapshotNaming.timestamp")).setValue(this.plugin.getSettings().snapshotNaming).onChange(r=>{this.plugin.updateSettings({snapshotNaming:r})})),new qt.Setting(t).setName(j("settings.logLevel")).setDesc(j("settings.logLevel.desc")).addDropdown(i=>i.addOption("debug","Debug").addOption("info","Info").addOption("warn","Warn").addOption("error","Error").setValue(this.plugin.getSettings().logLevel).onChange(r=>{this.plugin.updateSettings({logLevel:r})}))}buildKnowledgeGenerationSection(t){new qt.Setting(t).setName(j("settings.knowledgeGeneration")).setHeading(),new qt.Setting(t).setName(j("settings.analysisMode")).setDesc(j("settings.analysisMode.desc")).addDropdown(i=>i.addOption("local",j("settings.analysisMode.local")).addOption("hybrid",j("settings.analysisMode.hybrid")).addOption("remote",j("settings.analysisMode.remote")).setValue(this.plugin.getSettings().analysisMode).onChange(r=>{this.plugin.updateSettings({analysisMode:r})})),new qt.Setting(t).setName(j("settings.serviceBaseUrl")).setDesc(j("settings.serviceBaseUrl.desc")).addText(i=>i.setPlaceholder("Local draft service URL").setValue(this.plugin.getSettings().serviceBaseUrl).onChange(r=>{this.plugin.updateSettings({serviceBaseUrl:r.trim()})})),new qt.Setting(t).setName(j("settings.sendGeometrySummaryToRemote")).setDesc(j("settings.sendGeometrySummaryToRemote.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().sendGeometrySummaryToRemote).onChange(r=>{this.plugin.updateSettings({sendGeometrySummaryToRemote:r})})),new qt.Setting(t).setName(j("settings.sendPreviewImagesToRemote")).setDesc(j("settings.sendPreviewImagesToRemote.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().sendPreviewImagesToRemote).onChange(r=>{this.plugin.updateSettings({sendPreviewImagesToRemote:r})})),new qt.Setting(t).setName(j("settings.sendRawModelToRemote")).setDesc(j("settings.sendRawModelToRemote.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().sendRawModelToRemote).onChange(r=>{this.plugin.updateSettings({sendRawModelToRemote:r})}))}buildConvertersSection(t){if(new qt.Setting(t).setName(j("settings.converters")).setHeading(),vr()){t.createEl("p",{cls:"setting-item-description",text:j("settings.mobileSupport.desc")});return}let i=this.createSecondaryMenu(t,j("settings.converterMenu"),j("settings.converterMenu.desc"));this.buildConverterToggles(i);let r=this.createSecondaryMenu(t,j("settings.environmentInspector"),j("settings.environmentInspector.desc"));this.buildConverterPaths(r),this.buildDiagnostics(r)}buildConverterToggles(t){new qt.Setting(t).setName(j("settings.enableCad")).setDesc(j("settings.enableCad.desc")).addToggle(i=>{let r=this.plugin.getSettings().enabledConverterIds.includes("freecad");return i.setValue(r).onChange(s=>{let a=this.plugin.getSettings().enabledConverterIds,o=s?Array.from(new Set([...a,"freecad"])):a.filter(l=>l!=="freecad");this.plugin.updateSettings({enabledConverterIds:o})})}),new qt.Setting(t).setName(j("settings.enableObj2gltf")).setDesc(j("settings.enableObj2gltf.desc")).addToggle(i=>{let r=this.plugin.getSettings().enabledConverterIds.includes("obj2gltf");return i.setValue(r).onChange(s=>{let a=this.plugin.getSettings().enabledConverterIds,o=s?Array.from(new Set([...a,"obj2gltf"])):a.filter(l=>l!=="obj2gltf");this.plugin.updateSettings({enabledConverterIds:o})})}),new qt.Setting(t).setName(j("settings.preferObj2gltf")).setDesc(j("settings.preferObj2gltf.desc")).addToggle(i=>i.setValue(this.plugin.getSettings().preferObj2gltfForObj).onChange(r=>{this.plugin.updateSettings({preferObj2gltfForObj:r})})),new qt.Setting(t).setName(j("settings.enableFbx2gltf")).setDesc(j("settings.enableFbx2gltf.desc")).addToggle(i=>{let r=this.plugin.getSettings().enabledConverterIds.includes("fbx2gltf");return i.setValue(r).onChange(s=>{let a=this.plugin.getSettings().enabledConverterIds,o=s?Array.from(new Set([...a,"fbx2gltf"])):a.filter(l=>l!=="fbx2gltf");this.plugin.updateSettings({enabledConverterIds:o})})}),new qt.Setting(t).setName(j("settings.enableMesh")).setDesc(j("settings.enableMesh.desc")).addToggle(i=>{let r=this.plugin.getSettings().enabledConverterIds.includes("assimp");return i.setValue(r).onChange(s=>{let a=this.plugin.getSettings().enabledConverterIds,o=s?Array.from(new Set([...a,"assimp"])):a.filter(l=>l!=="assimp");this.plugin.updateSettings({enabledConverterIds:o})})}),new qt.Setting(t).setName(j("settings.enableSldprt")).setDesc(j("settings.enableSldprt.desc")).addToggle(i=>{let r=this.plugin.getSettings().enabledConverterIds.includes("sldprt");return i.setValue(r).onChange(s=>{let a=this.plugin.getSettings().enabledConverterIds,o=s?Array.from(new Set([...a,"sldprt"])):a.filter(l=>l!=="sldprt");this.plugin.updateSettings({enabledConverterIds:o})})})}buildConverterPaths(t){let i=qEe();new qt.Setting(t).setName(j("settings.paths")).setHeading(),new qt.Setting(t).setName(j("settings.pythonCmd")).setDesc(j("settings.pythonCmd.desc")).addText(r=>r.setPlaceholder(i.python).setValue(this.plugin.getSettings().freecadCommand).onChange(s=>{this.plugin.updateSettings({freecadCommand:s.trim()}),this.resetCommandDiagnostics()})),new qt.Setting(t).setName(j("settings.freecadCmd")).setDesc(j("settings.freecadCmd.desc")).addText(r=>r.setPlaceholder(i.freecad).setValue(this.plugin.getSettings().freecadcmdCommand).onChange(s=>{this.plugin.updateSettings({freecadcmdCommand:s.trim()}),this.resetCommandDiagnostics()})),new qt.Setting(t).setName(j("settings.obj2gltfCmd")).setDesc(j("settings.obj2gltfCmd.desc")).addText(r=>r.setPlaceholder(i.obj2gltf).setValue(this.plugin.getSettings().obj2gltfCommand).onChange(s=>{this.plugin.updateSettings({obj2gltfCommand:s.trim()}),this.resetCommandDiagnostics()})),new qt.Setting(t).setName(j("settings.fbx2gltfCmd")).setDesc(j("settings.fbx2gltfCmd.desc")).addText(r=>r.setPlaceholder(i.fbx2gltf).setValue(this.plugin.getSettings().fbx2gltfCommand).onChange(s=>{this.plugin.updateSettings({fbx2gltfCommand:s.trim()}),this.resetCommandDiagnostics()})),new qt.Setting(t).setName(j("settings.assimpCmd")).setDesc(j("settings.assimpCmd.desc")).addText(r=>r.setPlaceholder(i.python).setValue(this.plugin.getSettings().assimpCommand).onChange(s=>{this.plugin.updateSettings({assimpCommand:s.trim()}),this.resetCommandDiagnostics()}))}buildDiagnostics(t){new qt.Setting(t).setName(j("settings.diagnostics")).setDesc(j("settings.diagnostics.desc")).addButton(r=>r.setButtonText(j("settings.diagnostics.checkNow")).onClick(async()=>{r.setDisabled(!0),r.setButtonText(j("settings.diagnostics.checking")),this.diagnosticsEl&&await this.renderCommandDiagnostics(this.diagnosticsEl),r.setButtonText(j("settings.diagnostics.checkNow")),r.setDisabled(!1),new qt.Notice(j("settings.diagnostics.refreshed"))})),this.diagnosticsEl=t.createDiv({cls:"ai3d-settings-diagnostics"}),this.resetCommandDiagnostics()}buildPerformanceSection(t){new qt.Setting(t).setName(j("settings.performance")).setHeading(),new qt.Setting(t).setName(j("settings.canvasHeight")).setDesc(j("settings.canvasHeight.desc")).addSlider(i=>i.setLimits(200,800,25).setValue(this.plugin.getSettings().defaultCanvasHeight).setDynamicTooltip().onChange(r=>{this.plugin.updateSettings({defaultCanvasHeight:r})})),new qt.Setting(t).setName(j("settings.autoRotateSpeed")).setDesc(j("settings.autoRotateSpeed.desc")).addSlider(i=>i.setLimits(.1,2,.1).setValue(this.plugin.getSettings().autoRotateSpeed).setDynamicTooltip().onChange(r=>{this.plugin.updateSettings({autoRotateSpeed:r})})),new qt.Setting(t).setName(j("settings.renderQuality")).setDesc(j("settings.renderQuality.desc")).addDropdown(i=>i.addOption("low","Low").addOption("medium","Medium").addOption("high","High").setValue(this.plugin.getSettings().renderQuality).onChange(r=>{this.plugin.updateSettings({renderQuality:r})})),new qt.Setting(t).setName(j("settings.renderScale")).setDesc(j("settings.renderScale.desc")).addSlider(i=>i.setLimits(.25,2,.25).setValue(this.plugin.getSettings().renderScale).setDynamicTooltip().onChange(r=>{this.plugin.updateSettings({renderScale:r})}))}async renderCommandDiagnostics(t){let i=++this.diagnosticsRunId;t.empty(),t.createEl("p",{text:j("settings.diagnostics.checkingAvailability")});let{describeConverterCommandSource:r,inspectAllConverterCommands:s}=await Promise.resolve().then(()=>(fd(),Nw)),a=await s(this.plugin.getSettings());if(i===this.diagnosticsRunId){t.empty();for(let o of a)this.renderCommandStatus(t,o,r)}}renderCommandStatus(t,i,r){var o;let s=t.createDiv({cls:"ai3d-settings-status-block"});s.createEl("strong",{text:`${i.label}: ${i.available?j("settings.diagnostics.available"):j("settings.diagnostics.notFound")}`});let a=[`${j("settings.diagnostics.sourceLabel")}: ${r(i.source)}`,`${j("settings.diagnostics.commandLabel")}: ${i.command}`,i.resolvedPath&&i.resolvedPath!==i.command?`${j("settings.diagnostics.resolvedPathLabel")}: ${i.resolvedPath}`:"",i.detail].filter(Boolean);for(let l of a)s.createDiv({text:l});for(let l of(o=i.dependencyChecks)!=null?o:[])this.renderDependencyCheck(s,l)}renderDependencyCheck(t,i){let r=(()=>{switch(i.kind){case"cad-python":return j("settings.diagnostics.cadPythonCheck");case"mesh-python":return j("settings.diagnostics.meshPythonCheck");case"freecadcmd-cli":return j("settings.diagnostics.freecadCmdCheck");case"obj2gltf-cli":return j("settings.diagnostics.obj2gltfCheck");case"fbx2gltf-cli":return j("settings.diagnostics.fbx2gltfCheck")}})(),s=i.ok?j("settings.diagnostics.selfCheckOk"):j("settings.diagnostics.selfCheckFailed");t.createDiv({text:`${j("settings.diagnostics.selfCheckLabel")}: ${r} - ${s}`}),i.detail&&t.createDiv({text:i.detail})}}});function Fo(n,e,t=2.5){var i;if(typeof n=="string"){let r=(i=eF[n])!=null?i:eF.iso;return{alpha:r.alpha,beta:r.beta,radiusMultiplier:t}}return{alpha:n,beta:e!=null?e:Math.PI/3,radiusMultiplier:t}}function bl(n,e,t=.02){let i=(1-t*(n+1))/n,r=(1-t*(e+1))/e,s=[];for(let a=0;a({path:i.path,position:[-t/2+r*e,0,0],color:i.color,wireframe:i.wireframe}))}function iF(n,e){return n.map((t,i)=>{let r=2*Math.PI*i/n.length;return{path:t.path,position:[Math.cos(r)*e,0,Math.sin(r)*e],color:t.color,wireframe:t.wireframe}})}var eF,Dh=y(()=>{"use strict";eF={iso:{alpha:Math.PI/4,beta:Math.PI/3},front:{alpha:0,beta:Math.PI/2},side:{alpha:Math.PI/2,beta:Math.PI/2},top:{alpha:0,beta:.01},back:{alpha:Math.PI,beta:Math.PI/2},"3/4":{alpha:Math.PI/6,beta:Math.PI/3.5}}});var kQ,WQ=y(()=>{"use strict";Dh();kQ={name:"compare",description:"Side-by-side model comparison (2-4 models)",minModels:2,maxModels:4,compute(n,e){if(n.length<2||n.length>4)return null;let t=Number(e.spacing)||6,i=e.angle||"iso",r=wv(n,t),s=n.length<=3?n.length:2,a=Math.ceil(n.length/s),o=bl(s,a),l=n.map((c,f)=>({modelIndex:f,camera:Fo(i),viewport:o[f]}));return{placements:r,cells:l}}}});var HQ,zQ=y(()=>{"use strict";Dh();HQ={name:"showcase",description:"Single model viewed from multiple angles",minModels:1,maxModels:1,compute(n,e){if(n.length<1)return null;let t=Number(e.angles)||4,i=Number(e.radius)||2.5,r=[{path:n[0].path,position:[0,0,0],color:n[0].color,wireframe:n[0].wireframe}],s=t>=6?["front","side","top","back","iso","3/4"]:["iso","front","side","top"],a=s.length<=4?2:3,o=Math.ceil(s.length/a),l=bl(a,o),c=s.map((f,d)=>({modelIndex:0,camera:Fo(f,void 0,i),viewport:l[d]}));return{placements:r,cells:c}}}});var XQ,YQ=y(()=>{"use strict";Dh();XQ={name:"explode",description:"Spatial arrangement of parts (3-8 models in a ring)",minModels:3,maxModels:8,compute(n,e){if(n.length<3||n.length>8)return null;let t=Number(e.radius)||8,i=e.angle||"iso",r=iF(n,t),s=Math.min(n.length,4),a=Math.ceil(n.length/s),o=bl(s,a),l=n.map((c,f)=>({modelIndex:f,camera:Fo(i),viewport:o[f]}));return{placements:r,cells:l}}}});var KQ,jQ=y(()=>{"use strict";Dh();KQ={name:"timeline",description:"Horizontal progression of models (2-6 models in a strip)",minModels:2,maxModels:6,compute(n,e){if(n.length<2||n.length>6)return null;let t=Number(e.spacing)||6,i=e.angle||"3/4",r=wv(n,t),s=tF(n.length),a=n.map((o,l)=>({modelIndex:l,camera:Fo(i),viewport:s[l]}));return{placements:r,cells:a}}}});function rF(n,e,t,i,r){var f,d;if(!n||n.length===0)return null;let s=n.reduce((h,u)=>{var m;return h+((m=u.weight)!=null?m:1)},0);if(s<=0)return null;let a=[],o=0;for(let h of n){let m=((f=h.weight)!=null?f:1)/s*(1-t*(n.length+1));e==="horizontal"?a.push({x:t+o,y:t,w:m,h:1-2*t}):a.push({x:t,y:t+o,w:1-2*t,h:m}),o+=m+t}let l=[],c=[];for(let h=0;h{"use strict";qQ={name:"compose",description:"Combine multiple presets into one layout",minModels:1,maxModels:32,compute(n,e,t){return null}}});var ZQ,QQ=y(()=>{"use strict";Dh();ZQ={name:"gallery",description:"All models in one scene, single camera (no cell limit)",minModels:1,maxModels:32,compute(n,e){if(n.length===0)return null;let t=Number(e.spacing)||6,i=e.angle||"iso",r=Number(e.cols)||0,s=r>0?r:Math.ceil(Math.sqrt(n.length)),a=Math.ceil(n.length/s),o=n.map((f,d)=>{let h=d%s,u=Math.floor(d/s),m=(h-(s-1)/2)*t,_=(u-(a-1)/2)*t;return{path:f.path,position:[m,0,_],color:f.color,wireframe:f.wireframe}}),l=bl(1,1,0),c=[{modelIndex:0,camera:Fo(i,void 0,3+Math.max(s,a)*.5),viewport:l[0]}];return{placements:o,cells:c}}}});function wp(n){$Q.set(n.name,n)}function sF(n){return $Q.get(n)}var $Q,JQ=y(()=>{"use strict";WQ();zQ();YQ();jQ();nF();QQ();Dh();nF();$Q=new Map;wp(kQ);wp(HQ);wp(XQ);wp(KQ);wp(qQ);wp(ZQ)});function Fv(n){return QEe.schedule(n)}var aF,QEe,oF=y(()=>{"use strict";aF=class{constructor(e=1){this.maxActive=e;this.active=0;this.queue=[]}get activeCount(){return this.active}get queuedCount(){return this.queue.length}schedule(e){return new Promise((t,i)=>{this.queue.push({run:e,resolve:t,reject:i}),this.drain()})}drain(){for(;this.active0;){let e=this.queue.shift();if(!e)return;this.active+=1,Promise.resolve().then(e.run).then(e.resolve,e.reject).finally(()=>{this.active-=1,this.drain()})}}},QEe=new aF(1)});var s$={};Ue(s$,{registerCodeBlockProcessor:()=>JEe,registerGridCodeBlockProcessor:()=>tSe});async function i$(n){let{createConversionManager:e}=await Promise.resolve().then(()=>(m0(),u0));return e(n)}async function r$(n,e,t,i){var d,h,u,m;let r=typeof e=="string"?{path:e}:e,s=kc(n,r.path);if(!s)throw new Error(qi("workbench.fileNotFound",{path:r.path}));let a=(h=(d=s.split(".").pop())==null?void 0:d.toLowerCase())!=null?h:"";if(!Xa(a))throw Gp(a)?new Error(j("codeBlock.splatDisabled")):new Error(qi("codeBlock.unsupportedFormat",{ext:`.${a}`,formats:Ml().join(", ")}));let o=(u=Ka(n,s))!=null?u:void 0,l=(m=Ka(n,t$))!=null?m:void 0,c=await Ip({path:s,absolutePath:o,preferConversionExts:yp(t),conversionManager:()=>i$(t),convertedAssetCache:i,conversionOutputRoot:l}),f=Mv(c);return{sourcePath:s,effectivePath:f.path,effectiveExt:f.ext,warnings:f.warnings,model:{...r,path:f.path}}}async function $Ee(n,e,t,i){let r=[];for(let s of e.models){let a=await r$(n,s,t,i);r.push(a.model)}return{...e,models:r}}function n$(n){vr()&&n.createDiv({cls:"ai3d-mobile-mode-hint ai3d-mobile-mode-hint--inline",text:j("codeBlock.mobileHint")})}function JEe(n,e,t,i){return{id:"3d",handler:(r,s,a)=>{var I,C;let o=r.trim();if(!o){s.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noModelPathOrConfig")});return}let l;if(o.startsWith("{")||o.startsWith("["))try{let D=JSON.parse(o);l=eSe(D)}catch(D){let O=s.createDiv({cls:"ai3d-json-error"}),V=String(D).match(/position\s+(\d+)/),N=qi("codeBlock.jsonParseError",{error:String(D)});if(V){let F=parseInt(V[1],10),B=o.substring(0,F).split(` -`);N+=qi("codeBlock.jsonParseLine",{line:String(B.length)})}O.createEl("pre",{text:N});return}else l={models:[{path:o}]};if(!l.models||l.models.length===0){s.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noModelsInConfig")});return}l.models.length>1&&console.warn(`[AI3D] \`\`\`3d only supports one model; ${l.models.length-1} additional models ignored. Use \`\`\`3dgrid for multi-model.`);let f=l.models[0],d=kc(n,f.path);if(!d){s.createDiv({cls:"ai3d-inline-empty",text:qi("workbench.fileNotFound",{path:f.path})});return}let h=(C=(I=d.split(".").pop())==null?void 0:I.toLowerCase())!=null?C:"";if(!Xa(h)){s.createDiv({cls:"ai3d-inline-empty",text:Gp(h)?j("codeBlock.splatDisabled"):qi("codeBlock.unsupportedFormat",{ext:`.${h}`,formats:Ml().join(", ")})});return}let u=e(),m=s.createDiv({cls:"ai3d-preview-host"});l.height&&m.style.setProperty("--min-height",typeof l.height=="number"?`${l.height}px`:l.height),l.width&&m.style.setProperty("--max-width",typeof l.width=="number"?`${l.width}px`:l.width);let _=m.createEl("canvas",{cls:"ai3d-canvas-full"});Lp(_,"inline",d),m.appendChild(_);let p=null,g=null,v=!0,x=!1,T=!1;Op(_,()=>x?null:p);let E=xv(s,m,n,()=>p,()=>d,()=>{x||(x=!0,S.disconnect(),b.disconnect(),g==null||g.destroy(),g=null,p==null||p.destroy(),p=null,m.remove())},e,()=>{if(v=!v,g){let D=m.querySelector(".ai3d-annotation-overlay");D&&D.classList.toggle("is-hidden",!v)}return v},void 0,{labelKey:"helper.toggleAnnotationsVisibilityLabel",activeTooltipKey:"helper.annotationsVisible",inactiveTooltipKey:"helper.annotationsHidden"});n$(s);let S=new MutationObserver(()=>{x||s.contains(m)||(x=!0,S.disconnect(),b.disconnect(),g==null||g.destroy(),g=null,p==null||p.destroy(),p=null)});S.observe(s,{childList:!0});async function R(){if(T||x||!d)return;T=!0;let D=Ch(m);try{D.setPhaseKey("loading.preparingModel"),await Fv(async()=>{var K,ge,Re,Be,ae,me,ne,fe;if(x||!m.isConnected){D.hide();return}let O=(K=Ka(n,d))!=null?K:void 0,V=(ge=Ka(n,t$))!=null?ge:void 0;D.setPhaseKey("loading.preparingModel");let N=await Ip({path:d,absolutePath:O,preferConversionExts:yp(u),conversionManager:()=>i$(u),convertedAssetCache:t,conversionOutputRoot:V}),F=Mv(N),B=(Re=i==null?void 0:i(d))!=null?Re:[],G={ext:F.ext,annotationMode:B.length>0?"readonly":"none",rendererRollout:u.previewRendererRollout,useThreeRenderer:u.useThreeRenderer},{preview:J}=await Ap(e$,{surface:"code-block",modelPath:d},_,G);p=J,E.syncCapabilities(),D.setPhaseKey("loading.loadingModel");let $=await ja(n,F.path),te=async Pe=>ja(n,Pe);if(x){D.hide();return}let X=await p.loadModel($,F.ext,te,F.path);if(D.setProgress(100),Pv(m,X),x){D.hide();return}if(((Be=l.scene)==null?void 0:Be.autoRotate)===void 0&&u.autoRotateDefault&&(l.scene={...l.scene,autoRotate:!0,autoRotateSpeed:u.autoRotateSpeed}),p.applyConfig(l),(ae=p.setRenderQuality)==null||ae.call(p,u.renderQuality,u.renderScale),E.syncCapabilities(),B.length>0&&zb(p)){let Pe=p.getAnnotationProvider();Pe.canvas&&(g=new pd(Pe,m,"readonly",B,void 0,Iv(n),void 0,{app:n,previewMode:u.annotationPreviewMode,displayMode:u.annotationDisplayMode}),E.showAnnotateButton(),E.updateAnnotationBadge(B.length))}h==="stl"&&f.color&&((me=p.setSTLColor)==null||me.call(p,f.color)),h==="stl"&&f.wireframe!==void 0&&((ne=p.setWireframe)==null||ne.call(p,f.wireframe)),(fe=p.hasAnimations)!=null&&fe.call(p)&&E.showAnimButton(),D.hide()})}catch(O){x=!0,S.disconnect(),b.disconnect(),D.hide(),p==null||p.destroy(),p=null,m.replaceChildren();let V=bv(O);Rv(O)?console.warn("[AI3D] Inline preview blocked by converter settings:",V.message):console.error("[AI3D] Inline preview failed:",O),Cv(m,V)}}let b=new IntersectionObserver(D=>{for(let O of D)O.isIntersecting&&(b.disconnect(),R())},{rootMargin:"200px"});b.observe(m)}}}function eSe(n){if(typeof n=="string")return{models:[{path:n}]};if(typeof n!="object"||n===null)return{models:[]};let e=n;return typeof e.path=="string"?{models:[{path:e.path,color:e.color,wireframe:e.wireframe}],camera:e.camera,lights:e.lights,scene:e.scene,stl:e.stl,width:e.width,height:e.height}:{models:Array.isArray(e.models)?e.models.filter(i=>{let r=typeof i=="string"?i:i&&typeof i=="object"&&"path"in i?i.path:void 0;return typeof r=="string"&&r.length>0}).map(i=>{if(typeof i=="string")return{path:i};let r=i;return{path:r.path,color:r.color,wireframe:r.wireframe}}):[],camera:e.camera,lights:e.lights,scene:e.scene,stl:e.stl,width:e.width,height:e.height}}function tSe(n,e,t){return{id:"3dgrid",handler:(i,r,s)=>{var T,E,S,R,b,I,C,D;let a=i.trim();if(!a){r.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noConfigSpecified")});return}let o;try{o=JSON.parse(a)}catch(O){r.createDiv({cls:"ai3d-json-error"}).createEl("pre",{text:`JSON parse error: ${String(O)}`});return}if(o.preset!=="compose"&&(!o.models||o.models.length===0)){r.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noModelsSpecified")});return}let l=o.preset==="compose"?1:Math.max(1,(E=(T=o.models)==null?void 0:T.length)!=null?E:1),c=(I=(S=o.models)==null?void 0:S[0])!=null?I:(b=(R=o.sections)==null?void 0:R[0])==null?void 0:b.models[0],f=typeof c=="string"?c:(C=c==null?void 0:c.path)!=null?C:"",d=r.createDiv({cls:"ai3d-grid-host"}),h=d.createEl("canvas");if(bZ(h),d.appendChild(h),typeof o.rowHeight=="number"){let O=o.preset==="compose"?1:Math.ceil(l/((D=o.columns)!=null?D:Math.min(l,3)));d.style.setProperty("--grid-height",`${o.rowHeight*O}px`)}let u=null,m=!1,_=!1,p=null,g=null;MZ(h,()=>m?null:u);let v=xv(r,d,n,()=>u,()=>f,()=>{m||(m=!0,p==null||p.disconnect(),g==null||g.disconnect(),u==null||u.destroy(),u=null,d.remove())},e);n$(r),p=new MutationObserver(()=>{m||r.contains(d)||(m=!0,p==null||p.disconnect(),g==null||g.disconnect(),u==null||u.destroy(),u=null)}),p.observe(r,{childList:!0});async function x(){if(_||m)return;_=!0;let O=Ch(d);O.setPhaseKey("codeBlock.renderingGrid"),O.setProgress(-1);try{await Fv(async()=>{var $,te,X,K,ge,Re,Be,ae,me,ne;if(m||!d.isConnected){O.hide();return}let V=e(),N=[];for(let fe of($=o.models)!=null?$:[]){let Pe=await r$(n,fe,V,t);N.push(Pe)}let F=N.map(fe=>fe.model);f=(X=(te=N[0])==null?void 0:te.sourcePath)!=null?X:f;let{renderer:B}=await fw(e$,{surface:"3dgrid",preset:(K=o.preset)!=null?K:"compare",modelCount:(Re=(ge=o.models)==null?void 0:ge.length)!=null?Re:0},h);u=B,v.syncCapabilities();let G=u,J=async fe=>ja(n,fe);if(o.preset==="compose"){if(!o.sections||o.sections.length===0){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.composeRequiresSections")}),u.destroy(),u=null;return}let fe=[];for(let he of o.sections)try{if(!f){let Ye=he.models[0];if(Ye){let Et=typeof Ye=="string"?Ye:Ye.path;f=(Be=kc(n,Et))!=null?Be:Et}}let be=await $Ee(n,he,V,t);fe.push(be)}catch(be){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:be instanceof Error?be.message:String(be)}),G.destroy(),u=null;return}let Pe=rF(fe,(ae=o.direction)!=null?ae:"horizontal",Number((me=o.params)==null?void 0:me.gap)||.02,he=>typeof he=="string"?null:he,sF);if(!Pe){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.composeNoValidSections")}),G.destroy(),u=null;return}await G.loadWithPreset(Pe,J)}else if(o.preset){let fe=sF(o.preset);if(!fe){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:qi("codeBlock.unknownPreset",{preset:o.preset})}),G.destroy(),u=null;return}let Pe=fe.compute(F,(ne=o.params)!=null?ne:{});if(!Pe){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:qi("codeBlock.presetRequiresModels",{preset:o.preset,min:String(fe.minModels),max:String(fe.maxModels),count:String(F.length)})}),G.destroy(),u=null;return}await G.loadWithPreset(Pe,J)}else await G.loadModels(F,o,J);if(m){O.hide();return}O.hide()})}catch(V){m=!0,p==null||p.disconnect(),g==null||g.disconnect(),O.hide(),u==null||u.destroy(),u=null,console.error("[AI3D Grid] Failed:",V),d.createDiv({cls:"ai3d-inline-empty",text:V instanceof Error?V.message:qi("codeBlock.gridFailed",{reason:String(V)})})}}g=new IntersectionObserver(O=>{for(let V of O)V.isIntersecting&&(g==null||g.disconnect(),x())},{rootMargin:"200px"}),g.observe(d)}}}var e$,t$,a$=y(()=>{"use strict";Ya();$v();Gb();bp();vs();JQ();uw();Qb();_w();$b();Jb();yv();Mp();gn();Dv();ia();bn();r0();oF();e$=Hi("inline-code-block"),t$=".obsidian/ai-model-workbench/converted-assets"});var l$={};Ue(l$,{registerLazyCodeBlockProcessor:()=>iSe,registerLazyGridCodeBlockProcessor:()=>rSe});function o$(){return S0!=null||(S0=Promise.resolve().then(()=>(a$(),s$))),S0}function iSe(n,e,t,i){let r=null,s=async()=>(r!=null||(r=o$().then(a=>a.registerCodeBlockProcessor(n,e,t,i).handler)),r);return{id:"3d",handler:async(a,o,l)=>(await s())(a,o,l)}}function rSe(n,e,t){let i=null,r=async()=>(i!=null||(i=o$().then(s=>s.registerGridCodeBlockProcessor(n,e,t).handler)),i);return{id:"3dgrid",handler:async(s,a,o)=>(await r())(s,a,o)}}var S0,c$=y(()=>{"use strict";S0=null});function nSe(n){return n.includes("![[")}function f$(n,e){return Math.max(0,Math.min(e,n.length))}function d$(n,e,t){if(n.length===0)return!1;let i=n.lineAt(f$(n,e)),r=n.lineAt(f$(n,t));for(let s=i.number;s<=r.number;s++)if(nSe(n.line(s).text))return!0;return!1}function T0(n){if(!n.docChanged)return!1;let e=!1;return n.changes.iterChanges((t,i,r,s)=>{e||(e=d$(n.startState.doc,t,i)||d$(n.state.doc,r,s))}),e}var lF=y(()=>{"use strict"});function Bv(n){return createDiv().createDiv(n?{cls:n}:void 0)}function cF(n,e){return createDiv().createEl(n,e?{cls:e}:void 0)}var h$=y(()=>{"use strict"});var p$={};Ue(p$,{ModelEmbedWidget:()=>A0,registerLivePreviewExtension:()=>oSe});function u$(n,e,t,i,r,s,a,o,l,c,f,d,h,u,m,_){var v,x;let p="state"in n?n.state.doc:n.doc,g=[];for(let T=1;T<=p.lines;T++){let E=p.line(T),S=E.text;if(!S.includes("!["))continue;let R=0;for(;R0&&S[b-1]==="\\"){R=b+3;continue}let I=S.indexOf("]]",b+3);if(I===-1)break;let D=S.slice(b+3,I).split("|"),O=D[0].trim(),V=(x=(v=O.split(".").pop())==null?void 0:v.toLowerCase())!=null?x:"";if(!Xa(V)){R=I+2;continue}let N=400,F=300;if(D.length>1){let $=D[1].trim().match(/^(\d+)\s*x\s*(\d+)$/);$&&(N=parseInt($[1],10),F=parseInt($[2],10))}let B=kc(e,O);if(!B){R=I+2;continue}let G=E.from+b,J=E.from+I+2;g.push(Fp.Decoration.replace({widget:new A0(e,B,N,F,t,i,r,s,a,o,l,c,f,d,h,u,m,_),block:!0}).range(G,J)),R=I+2}}return g}function m$(n){return n.length===0?Lh.RangeSet.empty:Lh.RangeSet.of(n,!0)}function oSe(n,e,t,i){let r=Lh.StateField.define({create(s){let a=e(),o=u$(s,n,a.autoRotateDefault,a.enabledConverterIds,a.freecadCommand,a.obj2gltfCommand,a.fbx2gltfCommand,a.freecadcmdCommand,a.preferObj2gltfForObj,a.preferFbx2gltfForFbx,a.annotationPreviewMode,a.annotationDisplayMode,a.previewRendererRollout,a.useThreeRenderer,t,i);return m$(o)},update(s,a){if(a.docChanged){if(!T0(a))return s.map(a.changes);let o=e(),l=u$(a.state,n,o.autoRotateDefault,o.enabledConverterIds,o.freecadCommand,o.obj2gltfCommand,o.fbx2gltfCommand,o.freecadcmdCommand,o.preferObj2gltfForObj,o.preferFbx2gltfForFbx,o.annotationPreviewMode,o.annotationDisplayMode,o.previewRendererRollout,o.useThreeRenderer,t,i);return m$(l)}return s.map(a.changes)},provide:s=>Fp.EditorView.decorations.from(s)});return[Lh.Prec.highest(r)]}var Fp,Lh,sSe,aSe,A0,_$=y(()=>{"use strict";Fp=require("@codemirror/view"),Lh=require("@codemirror/state");Ya();vs();Jb();h$();ia();gn();bn();r0();lF();oF();sSe=Hi("inline-live-preview"),aSe=".obsidian/ai-model-workbench/converted-assets",A0=class extends Fp.WidgetType{constructor(t,i,r,s,a,o,l,c,f,d,h,u,m,_,p,g,v,x){super();this.app=t;this.modelPath=i;this.width=r;this.height=s;this.autoRotate=a;this.enabledConverterIds=o;this.freecadCommand=l;this.obj2gltfCommand=c;this.fbx2gltfCommand=f;this.freecadcmdCommand=d;this.preferObj2gltfForObj=h;this.preferFbx2gltfForFbx=u;this.annotationPreviewMode=m;this.annotationDisplayMode=_;this.previewRendererRollout=p;this.useThreeRenderer=g;this.convertedAssetCache=v;this.getAnnotations=x;this.preview=null;this.annotationMgr=null;this.readyObs=null;this.viewportObs=null;this.pollId=0;this.initStarted=!1;this.destroyed=!1;this.initGeneration=0;this.viewportReady=!1}eq(t){return this.modelPath===t.modelPath&&this.width===t.width&&this.height===t.height&&this.autoRotate===t.autoRotate&&this.enabledConverterIds.join("|")===t.enabledConverterIds.join("|")&&this.freecadCommand===t.freecadCommand&&this.obj2gltfCommand===t.obj2gltfCommand&&this.fbx2gltfCommand===t.fbx2gltfCommand&&this.freecadcmdCommand===t.freecadcmdCommand&&this.preferObj2gltfForObj===t.preferObj2gltfForObj&&this.preferFbx2gltfForFbx===t.preferFbx2gltfForFbx&&this.annotationPreviewMode===t.annotationPreviewMode&&this.annotationDisplayMode===t.annotationDisplayMode&&this.previewRendererRollout===t.previewRendererRollout&&this.convertedAssetCache===t.convertedAssetCache}toDOM(){let t=vr(),i=Bv("ai3d-embed-preview ai3d-cm-widget");i.setAttribute("contenteditable","false"),t&&i.classList.add("is-mobile","is-mobile-scroll-mode");let r=cF("canvas","ai3d-embed-canvas"),s=t?Math.min(this.height,220):this.height;r.style.setProperty("--ai3d-embed-height",`${s}px`),Lp(r,"live-preview",this.modelPath),Op(r,()=>this.destroyed?null:this.preview),i.appendChild(r);let a=Ch(i),o=Bv("ai3d-embed-error is-hidden");if(i.appendChild(o),t){let f=!1,d=Bv("ai3d-mobile-mode-bar"),h=Bv("ai3d-mobile-mode-hint");h.textContent=j("livePreview.mobileHint");let u=cF("button","ai3d-mobile-mode-btn");u.type="button";let m=()=>{i.classList.toggle("is-mobile-interactive",f),i.classList.toggle("is-mobile-scroll-mode",!f),u.textContent=f?j("helper.scrollAction"):j("helper.interactAction"),u.classList.toggle("ai3d-btn-active",f),u.setAttribute("aria-label",f?j("helper.disableInteractionLabel"):j("helper.enableInteractionLabel"))};u.addEventListener("click",()=>{f=!f,m()}),m(),d.append(h,u),i.appendChild(d)}let l=()=>{this.destroyed||this.initStarted||this.viewportReady&&(!i.isConnected||r.clientWidth<=0||r.clientHeight<=0||(this.initStarted=!0,this.stopReadyPoll(),this.stopReadyWatch(),this.stopViewportWatch(),this.initPreview(i,r,a,o,++this.initGeneration)))};this.readyObs=new ResizeObserver(()=>l()),this.readyObs.observe(i),this.readyObs.observe(r);let c=()=>{if(this.pollId||this.destroyed||this.initStarted)return;let f=0,d=()=>{this.pollId=0,!(this.destroyed||this.initStarted)&&(l(),!this.initStarted&&(++f>240||(this.pollId=window.requestAnimationFrame(d))))};this.pollId=window.requestAnimationFrame(d)};return typeof IntersectionObserver=="undefined"?(this.viewportReady=!0,c(),l()):(this.viewportObs=new IntersectionObserver(f=>{this.destroyed||this.initStarted||f.some(d=>d.isIntersecting||d.intersectionRatio>0)&&(this.viewportReady=!0,this.stopViewportWatch(),c(),l())},{rootMargin:"200px"}),this.viewportObs.observe(i)),i}stopReadyPoll(){this.pollId&&(window.cancelAnimationFrame(this.pollId),this.pollId=0)}async initPreview(t,i,r,s,a){var o;try{r.setPhaseKey("loading.preparingModel"),await Fv(async()=>{var R,b,I,C,D,O;if(this.destroyed||a!==this.initGeneration||!t.isConnected){r.hide();return}let[{prepareModelInput:l},{listPreferredConversionExts:c},{createLoggedModelPreview:f},{supportsAnnotationPreview:d},{AnnotationManager:h},{createNoteReader:u},{renderModelPerformanceFeedback:m}]=await Promise.all([Promise.resolve().then(()=>(Qb(),fZ)),Promise.resolve().then(()=>($b(),dZ)),Promise.resolve().then(()=>(Gb(),Qq)),Promise.resolve().then(()=>(bp(),tZ)),Promise.resolve().then(()=>($v(),JF)),Promise.resolve().then(()=>(yv(),pZ)),Promise.resolve().then(()=>(Dv(),vw))]),_=(R=Ka(this.app,this.modelPath))!=null?R:void 0;r.setPhaseKey("loading.preparingModel");let p=(b=Ka(this.app,aSe))!=null?b:void 0,g=await l({path:this.modelPath,absolutePath:_,preferConversionExts:c({preferObj2gltfForObj:this.preferObj2gltfForObj,preferFbx2gltfForFbx:this.preferFbx2gltfForFbx}),conversionManager:async()=>{let{createConversionManager:V}=await Promise.resolve().then(()=>(m0(),u0));return V({enabledConverterIds:this.enabledConverterIds,freecadCommand:this.freecadCommand,obj2gltfCommand:this.obj2gltfCommand,fbx2gltfCommand:this.fbx2gltfCommand,freecadcmdCommand:this.freecadcmdCommand})},convertedAssetCache:this.convertedAssetCache,conversionOutputRoot:p}),v=(C=(I=this.getAnnotations)==null?void 0:I.call(this,this.modelPath))!=null?C:[],x={ext:g.effectiveExt,annotationMode:v.length>0?"readonly":"none",rendererRollout:this.previewRendererRollout,useThreeRenderer:this.useThreeRenderer},{preview:T}=await f(sSe,{surface:"live-preview",modelPath:this.modelPath},i,x);if(this.destroyed||a!==this.initGeneration){T.destroy();return}this.preview=T,r.setPhaseKey("loading.loadingModel");let E=await ja(this.app,g.effectivePath);if(this.destroyed||a!==this.initGeneration){(D=this.preview)==null||D.destroy(),this.preview=null;return}let S=await this.preview.loadModel(E,g.effectiveExt,V=>ja(this.app,V),g.effectivePath);if(this.destroyed||a!==this.initGeneration){(O=this.preview)==null||O.destroy(),this.preview=null;return}if(m(t,S),this.autoRotate&&this.preview.applyConfig({models:[],scene:{autoRotate:!0,autoRotateSpeed:.5}}),v.length>0&&d(this.preview)){let V=this.preview.getAnnotationProvider();V.canvas&&(this.annotationMgr=new h(V,t,"readonly",v,void 0,u(this.app),void 0,{app:this.app,previewMode:this.annotationPreviewMode,displayMode:this.annotationDisplayMode}))}r.setProgress(100),r.hide()})}catch(l){if(this.destroyed||a!==this.initGeneration)return;(o=this.preview)==null||o.destroy(),this.preview=null,r.hide(),s.remove(),t.replaceChildren();let[{describeModelLoadFailure:c,isMissingConverterError:f},{renderModelLoadFailure:d}]=await Promise.all([Promise.resolve().then(()=>(Mp(),aZ)),Promise.resolve().then(()=>(Dv(),vw))]),h=c(l);f(l)?console.warn("[AI3D] Live Preview blocked by converter settings:",h.message):console.error("[AI3D] Live Preview failed:",l),d(t,h)}finally{r.hide()}}destroy(){var t;this.destroyed=!0,this.stopReadyPoll(),this.stopReadyWatch(),this.stopViewportWatch(),(t=this.annotationMgr)==null||t.destroy(),this.annotationMgr=null,this.preview&&(this.preview.destroy(),this.preview=null),this.initStarted=!1,this.viewportReady=!1}stopReadyWatch(){var t;(t=this.readyObs)==null||t.disconnect(),this.readyObs=null}stopViewportWatch(){var t;(t=this.viewportObs)==null||t.disconnect(),this.viewportObs=null}ignoreEvent(){return!0}}});var E$={};Ue(E$,{registerLazyLivePreviewExtension:()=>cSe});function lSe(){return x0!=null||(x0=Promise.resolve().then(()=>(_$(),p$))),x0}function g$(n,e,t,i,r,s,a,o,l,c,f,d,h,u,m,_){var v,x;let p="state"in n?n.state.doc:n.doc,g=[];for(let T=1;T<=p.lines;T++){let E=p.line(T),S=E.text;if(!S.includes("!["))continue;let R=0;for(;R0&&S[b-1]==="\\"){R=b+3;continue}let I=S.indexOf("]]",b+3);if(I===-1)break;let D=S.slice(b+3,I).split("|"),O=D[0].trim(),V=(x=(v=O.split(".").pop())==null?void 0:v.toLowerCase())!=null?x:"";if(!Xa(V)){R=I+2;continue}let N=400,F=300;if(D.length>1){let G=D[1].trim().match(/^(\d+)\s*x\s*(\d+)$/);G&&(N=parseInt(G[1],10),F=parseInt(G[2],10))}let B=kc(e,O);if(!B){R=I+2;continue}g.push(Bp.Decoration.replace({widget:new fF(e,B,N,F,t,i,r,s,a,o,l,c,f,d,h,u,m,_),block:!0}).range(E.from+b,E.from+I+2)),R=I+2}}return g}function v$(n){return n.length===0?Oh.RangeSet.empty:Oh.RangeSet.of(n,!0)}function cSe(n,e,t,i){let r=Oh.StateField.define({create(s){let a=e(),o=g$(s,n,a.autoRotateDefault,a.enabledConverterIds,a.freecadCommand,a.obj2gltfCommand,a.fbx2gltfCommand,a.freecadcmdCommand,a.preferObj2gltfForObj,a.preferFbx2gltfForFbx,a.annotationPreviewMode,a.annotationDisplayMode,a.previewRendererRollout,a.useThreeRenderer,t,i);return v$(o)},update(s,a){if(a.docChanged){if(!T0(a))return s.map(a.changes);let o=e(),l=g$(a.state,n,o.autoRotateDefault,o.enabledConverterIds,o.freecadCommand,o.obj2gltfCommand,o.fbx2gltfCommand,o.freecadcmdCommand,o.preferObj2gltfForObj,o.preferFbx2gltfForFbx,o.annotationPreviewMode,o.annotationDisplayMode,o.previewRendererRollout,o.useThreeRenderer,t,i);return v$(l)}return s.map(a.changes)},provide:s=>Bp.EditorView.decorations.from(s)});return[Oh.Prec.highest(r)]}var Bp,Oh,x0,fF,S$=y(()=>{"use strict";Bp=require("@codemirror/view"),Oh=require("@codemirror/state");Ya();vs();lF();x0=null;fF=class extends Bp.WidgetType{constructor(t,i,r,s,a,o,l,c,f,d,h,u,m,_,p,g,v,x){super();this.app=t;this.modelPath=i;this.width=r;this.height=s;this.autoRotate=a;this.enabledConverterIds=o;this.freecadCommand=l;this.obj2gltfCommand=c;this.fbx2gltfCommand=f;this.freecadcmdCommand=d;this.preferObj2gltfForObj=h;this.preferFbx2gltfForFbx=u;this.annotationPreviewMode=m;this.annotationDisplayMode=_;this.previewRendererRollout=p;this.useThreeRenderer=g;this.convertedAssetCache=v;this.getAnnotations=x;this.mountedWidget=null;this.mountedDom=null;this.destroyed=!1}eq(t){return this.modelPath===t.modelPath&&this.width===t.width&&this.height===t.height&&this.autoRotate===t.autoRotate&&this.enabledConverterIds.join("|")===t.enabledConverterIds.join("|")&&this.freecadCommand===t.freecadCommand&&this.obj2gltfCommand===t.obj2gltfCommand&&this.fbx2gltfCommand===t.fbx2gltfCommand&&this.freecadcmdCommand===t.freecadcmdCommand&&this.preferObj2gltfForObj===t.preferObj2gltfForObj&&this.preferFbx2gltfForFbx===t.preferFbx2gltfForFbx&&this.annotationPreviewMode===t.annotationPreviewMode&&this.annotationDisplayMode===t.annotationDisplayMode&&this.previewRendererRollout===t.previewRendererRollout&&this.useThreeRenderer===t.useThreeRenderer&&this.convertedAssetCache===t.convertedAssetCache}toDOM(){let t=activeDocument.createElement("div");return t.className="ai3d-embed-preview ai3d-cm-widget ai3d-embed-preview-lazy",t.setAttribute("contenteditable","false"),this.mount(t),t}destroy(){var t,i;this.destroyed=!0,(t=this.mountedWidget)==null||t.destroy(),this.mountedWidget=null,(i=this.mountedDom)==null||i.remove(),this.mountedDom=null}ignoreEvent(){return!0}async mount(t){let i;try{i=await lSe()}catch(a){console.warn("[AI3D] Failed to load Live Preview widget runtime:",a),!this.destroyed&&t.isConnected&&(t.textContent="AI3D live preview failed to load.");return}let r=new i.ModelEmbedWidget(this.app,this.modelPath,this.width,this.height,this.autoRotate,this.enabledConverterIds,this.freecadCommand,this.obj2gltfCommand,this.fbx2gltfCommand,this.freecadcmdCommand,this.preferObj2gltfForObj,this.preferFbx2gltfForFbx,this.annotationPreviewMode,this.annotationDisplayMode,this.previewRendererRollout,this.useThreeRenderer,this.convertedAssetCache,this.getAnnotations);if(this.destroyed||!t.isConnected){r.destroy();return}let s=r.toDOM();if(this.destroyed||!t.isConnected){r.destroy();return}this.mountedWidget=r,this.mountedDom=s,t.replaceWith(s)}}});var T$={};Ue(T$,{setupHeadingPinObserver:()=>dSe});function fSe(n){if(n.length===0)return"var(--interactive-accent)";if(n.length===1)return n[0];let e=100/n.length;return`linear-gradient(135deg, ${n.map((t,i)=>{let r=Math.round(i*e),s=Math.round((i+1)*e);return`${t} ${r}% ${s}%`}).join(", ")})`}function hF(n){return n.map(e=>`${e.pinId}:${e.modelPath}:${e.color}`).sort().join("|")}function dF(n){return Array.from(n.entries()).map(([e,t])=>`${e}=>${hF(t)}`).sort().join("||")}function dSe(n){let e=new Map,t=null,i=new Map,r="",s=b=>{var D;if(b===t)return!1;let I=new Map,C=t===null;for(let[O,V]of Object.entries(b)){let N=(D=V.annotations)!=null?D:[];I.set(O,N),i.get(O)!==N&&(C=!0)}return I.size!==i.size&&(C=!0),t=b,i=I,C},a=(b=n.getModelAssetProfiles())=>{let I=new Map;for(let[C,D]of Object.entries(b))for(let O of D.annotations)if(O.headingRef&&O.id){let V=Cp(O.headingRef);if(!V)continue;let N=I.get(V);N||(N=[],I.set(V,N)),N.push({pinId:O.id,modelPath:C,color:O.color})}return I},o=b=>Cp(Array.from(b.childNodes).map(I=>{var C;return I.instanceOf(Element)&&I.classList.contains("ai3d-heading-pin-badge")?"":(C=I.textContent)!=null?C:""}).join(" ")),l=b=>{let I=e.get(b);I&&(b.removeEventListener("mouseover",I.handler),I.badge.remove(),delete b.dataset.pinBound,e.delete(b))},c=(b,I)=>{if(I.length===0){l(b);return}let C=hF(I),D=e.get(b);if((D==null?void 0:D.signature)===C)return;D&&l(b),b.dataset.pinBound=C;let O=b.createSpan({cls:"ai3d-heading-pin-badge"}),V=[...new Set(I.map(J=>J.color).filter(Boolean))],N=O.createSpan({cls:"ai3d-heading-pin-badge-swatch"});if(N.style.background=fSe(V),N.title=I.length>1?j("headingPin.showMultiple"):j("headingPin.showSingle"),N.setAttribute("role","button"),N.setAttribute("tabindex","0"),I.length>1){let J=O.createSpan({cls:"ai3d-heading-pin-badge-count"});J.textContent=`\xD7${I.length}`}let F=[...new Set(I.map(J=>Qr(J.modelPath)))];O.title=qi("headingPin.linkedTo",{models:F.join(", ")});let B=J=>{J==null||J.stopPropagation(),J==null||J.preventDefault();for(let $ of I)activeDocument.dispatchEvent(new CustomEvent("ai3d-pin-highlight",{detail:{pinId:$.pinId}}))};N.addEventListener("click",J=>{B(J)}),N.addEventListener("keydown",J=>{J.instanceOf(KeyboardEvent)&&(J.key!=="Enter"&&J.key!==" "||B(J))}),O.addEventListener("click",J=>{J.stopPropagation()}),b.appendChild(O);let G=()=>{for(let J of I)activeDocument.dispatchEvent(new CustomEvent("ai3d-pin-highlight",{detail:{pinId:J.pinId}}))};b.addEventListener("mouseover",G),e.set(b,{badge:O,handler:G,signature:C})},f=(b,I)=>{var D;let C=o(b);c(b,(D=I.get(C))!=null?D:[])},d=b=>{var I;for(let[C,D]of Array.from(e.entries())){if(!C.isConnected){l(C);continue}let O=(I=b.get(o(C)))!=null?I:[],V=hF(O);(O.length===0||D.signature!==V)&&c(C,O)}},h=(b,I)=>{b.querySelectorAll(Vv).forEach(C=>f(C,I))},u=()=>{let b=n.getModelAssetProfiles();s(b);let I=a(b);r=dF(I),d(I),activeDocument.querySelectorAll(Uv).forEach(D=>h(D,I))},m=0,_=(b=0)=>{m&&window.clearTimeout(m),m=window.setTimeout(()=>{m=0,u()},b)},p=n.subscribeStore(()=>{let b=n.getModelAssetProfiles();if(!s(b))return;let I=a(b),C=dF(I);C!==r&&(r=C,_())});n.onLayoutChange(()=>{_(200)});let g=b=>b.matches(Uv)||b.matches(Vv)?!0:!!b.querySelector(Uv)||!!b.querySelector(Vv),v=b=>b.isConnected&&g(b),x=b=>g(b),T=new Set,E=0,S=()=>{var C,D,O,V,N,F;let b=Array.from(T);T.clear(),E=0;let I=a();d(I);for(let B of b)B.isConnected&&((C=B.matches)!=null&&C.call(B,Vv)&&f(B,I),(O=(D=B.querySelectorAll)==null?void 0:D.call(B,Vv))==null||O.forEach(G=>f(G,I)),(V=B.matches)!=null&&V.call(B,Uv)&&h(B,I),(F=(N=B.querySelectorAll)==null?void 0:N.call(B,Uv))==null||F.forEach(G=>h(G,I)));r=dF(I)},R=new MutationObserver(b=>{let I=!1;for(let C of b){for(let D of Array.from(C.addedNodes))D.instanceOf(HTMLElement)&&v(D)&&(T.add(D),I=!0);for(let D of Array.from(C.removedNodes))D.instanceOf(HTMLElement)&&x(D)&&(I=!0)}I&&!E&&(E=window.setTimeout(S,100))});R.observe(activeDocument.body,{childList:!0,subtree:!0}),n.registerCleanup(()=>{p(),R.disconnect(),E&&(window.clearTimeout(E),E=0),m&&(window.clearTimeout(m),m=0);for(let b of Array.from(e.keys()))l(b)}),_(500)}var Uv,Vv,A$=y(()=>{"use strict";gn();yv();vs();Uv=".markdown-preview-view, .markdown-source-view",Vv=[".markdown-preview-view h1",".markdown-preview-view h2",".markdown-preview-view h3",".markdown-preview-view h4",".markdown-preview-view h5",".markdown-preview-view h6",".cm-heading-1",".cm-heading-2",".cm-heading-3",".cm-heading-4",".cm-heading-5",".cm-heading-6",".cm-header-1",".cm-header-2",".cm-header-3",".cm-header-4",".cm-header-5",".cm-header-6"].join(", ")});var R$={};Ue(R$,{ModelFileSuggestModal:()=>uF});var x$,uF,b$=y(()=>{"use strict";x$=require("obsidian");Ya();gn();uF=class extends x$.FuzzySuggestModal{constructor(e,t){super(e),this.onChoose=t,this.setPlaceholder(j("modal.selectModel"))}getItems(){return this.app.vault.getFiles().filter(e=>{let t=e.extension.toLowerCase();return Xa(t)})}getItemText(e){return e.path}onChooseItem(e){this.onChoose(e)}}});function M$(n,e){return n==="three"?{backend:n,supportedFormats:hSe,fallbackRole:"Primary single-model preview path",capabilities:[...e],colorPipeline:"sRGB output, no tone mapping, PBR material preservation",fidelityNotes:["Direct GLB/GLTF/STL/PLY/OBJ are expected to preserve geometry scale and material color intent.","Workbench, grid, and SPLAT routes still keep Babylon fallback coverage."]}:{backend:n,supportedFormats:uSe,fallbackRole:"Capability and compatibility backend",capabilities:[...e],colorPipeline:"Babylon material pipeline with conservative fallback behavior",fidelityNotes:["3dgrid, conservative workbench, SPLAT, and converted workbench inputs remain on Babylon.","Babylon remains the rollback path when Three direct rendering is disabled."]}}function I$(n){return n.backend==="three"?M$("three",["annotation","animation","measurement","disassembly","focus-selection","wireframe","orientation-gizmo","bounding-box","render-scale","workbench"]):M$("babylon",["annotation","animation","measurement","disassembly","focus-selection","wireframe","orientation-gizmo","bounding-box","render-scale","workbench"])}function y$(n){return[`${n.backend}`,`formats=${n.supportedFormats.join("/")}`,`capabilities=${n.capabilities.join("/")||"none"}`,`role=${n.fallbackRole}`].join("; ")}var hSe,uSe,C$=y(()=>{"use strict";bp();hSe=["glb","gltf","stl","ply","obj"],uSe=["glb","gltf","stl","ply","obj","splat","converted-glb"]});var D$={};Ue(D$,{buildDiagnosticsReport:()=>xSe});function R0(n){return typeof n=="boolean"?n?"on":"off":typeof n=="number"?Number.isFinite(n)?String(n):"unknown":typeof n=="string"?n.length>0?n:"empty":"unknown"}function mSe(n){var i;let e=(i=n.split(/[\\/]/).pop())!=null?i:n,t=e.lastIndexOf(".");return t<=0||t===e.length-1?"":`.${e.slice(t+1).toLowerCase()}`}function Up(n,e,t){if(!n)return t;if(e)return n;let i=mSe(n);return i?``:""}function Gv(n,e){return n?`set (${Up(n,e,"not set")})`:"not set"}function pSe(n){let e=n.settings;return e.analysisMode==="local"?"local only":[e.analysisMode,e.serviceBaseUrl.trim()?"service configured":"service missing",`geometry ${R0(e.sendGeometrySummaryToRemote)}`,`preview refs ${R0(e.sendPreviewImagesToRemote)}`,`raw model ${e.sendRawModelToRemote?"blocked if requested":"off"}`].join(", ")}function _Se(n){let e=n.currentModelPath;return e?n.modelAssetProfiles[e]:void 0}function gSe(n){let e=n.lastKnowledgeGeneration;return e?e.status==="pending"?"pending or interrupted; rerun generation to replace the marker":e.status==="failed"?"failed; inspect console details and rerun after fixing the issue":e.warningCount>0?"completed with warnings":"none":"none"}function TSe(n){let e=new Set(n.enabledConverterIds);return vSe.map(t=>{let i=n[t.settingsKey].trim(),r=i.length===0?"command not configured":ESe.test(i)?"command configured, unsafe command rejected":"command configured, path redacted";return`${t.label}: ${e.has(t.id)?"enabled":"disabled"}, ${r}`}).join("; ")}function ASe(n){let e=n.convertedAssetRecords;if(e.length===0)return"none";let t=new Set(e.map(r=>`${r.sourcePath}:${r.sourceExt}:${r.targetExt}`)).size,i=e.filter(r=>r.warnings.length>0).length;return[`${e.length} record(s) for ${t} source(s)`,"validated before reuse for cache version, converter identity, output presence, and source freshness",i>0?`${i} record(s) carry warning text`:""].filter(Boolean).join("; ")}function xSe(n){var c,f,d,h,u,m,_,p,g;let{manifest:e,state:t}=n,i=t.settings,r=_Se(t),s=n.includeVaultPaths===!0,a=t.currentModelPath?jh({ext:(c=t.currentModelPath.split(".").pop())!=null?c:"",annotationMode:r!=null&&r.annotations.length?"readonly":"none",allowEditModeOnThree:!0,allowWorkbenchFeaturesOnThree:i.experimentalThreeWorkbench,rendererRollout:i.previewRendererRollout,useThreeRenderer:i.useThreeRenderer}):null,o=a?I$(a):null,l=t.lastKnowledgeGeneration;return["# AI Model Workbench Diagnostics","",`Generated: ${(f=n.generatedAt)!=null?f:new Date().toISOString()}`,"","## Runtime","",`- Plugin version: ${e.version}`,`- Minimum Obsidian version: ${e.minAppVersion}`,`- Obsidian API version: ${P$.apiVersion}`,`- Platform: ${vr()?"mobile":"desktop"}`,`- Locale: ${i.locale}`,"","## Renderer","",`- Use Three renderer: ${R0(i.useThreeRenderer)}`,`- Preview rollout: ${i.previewRendererRollout}`,`- Experimental Three workbench: ${R0(i.experimentalThreeWorkbench)}`,`- Current route: ${a?`${a.backend} (${a.reason})`:"no current model"}`,`- Route capability profile: ${o?y$(o):"no current model"}`,`- Route color pipeline: ${(d=o==null?void 0:o.colorPipeline)!=null?d:"no current model"}`,`- Render quality: ${i.renderQuality}`,`- Render scale: ${i.renderScale}`,"","## Current Model","",`- Path: ${Up(t.currentModelPath,s,"none")}`,`- Preview summary: ${t.modelPreview?`${t.modelPreview.meshCount} mesh(es), ${t.modelPreview.triangleCount.toLocaleString()} triangle(s), ${t.modelPreview.materialCount} material(s)`:"not captured"}`,`- Annotation count: ${(h=r==null?void 0:r.annotations.length)!=null?h:0}`,`- Registered part candidates: ${(m=(u=r==null?void 0:r.registeredParts)==null?void 0:u.length)!=null?m:0}`,`- Report note: ${Gv(r==null?void 0:r.reportNotePath,s)}`,`- Analysis sidecar: ${Gv(r==null?void 0:r.analysisSidecarPath,s)}`,`- Knowledge index: ${Gv(r==null?void 0:r.knowledgeIndexPath,s)}`,"","## Knowledge Generation","",`- Mode: ${pSe(t)}`,`- Report folder: ${Up(i.reportFolder,s,"empty")}`,`- Part notes folder: ${Up(i.partFolder,s,"empty")}`,`- Snapshot folder: ${Up(i.previewFolder,s,"empty")}`,`- Last generation: ${l?`${l.status} at ${l.generatedAt}`:"none"}`,`- Last generation attention: ${gSe(t)}`,`- Last generated model: ${Up(l==null?void 0:l.modelPath,s,"none")}`,`- Last report: ${Gv(l==null?void 0:l.reportNotePath,s)}`,`- Last index: ${Gv(l==null?void 0:l.knowledgeIndexPath,s)}`,`- Last part notes: ${(_=l==null?void 0:l.partNoteCount)!=null?_:0}`,`- Last preview images: ${(p=l==null?void 0:l.previewImageCount)!=null?p:0}`,`- Last warning count: ${(g=l==null?void 0:l.warningCount)!=null?g:0}`,"","## Conversion","",`- Enabled converters: ${i.enabledConverterIds.length?i.enabledConverterIds.join(", "):"none"}`,`- Cached conversions: ${t.convertedAssetRecords.length}`,`- Converter command status: ${TSe(i)}`,`- Conversion cache status: ${ASe(t)}`,`- Conversion timeout: ${SSe}ms outer budget`,"- Converter safety: missing converters report their converter id; unsafe configured commands are rejected before execution; command paths are redacted.",`- Supported direct/model extensions: ${Ml().join(", ")}`,"","## Notes","","- Draft service URL and command paths are intentionally omitted from this report.",s?"- Vault-relative model and note paths are included because includeVaultPaths was requested.":"- Vault-relative model, report, index, and folder paths are redacted by default.","- Attach this report with the model format, console error, and reproduction steps when filing a bug.",""].join(` +`);N+=qi("codeBlock.jsonParseLine",{line:String(B.length)})}O.createEl("pre",{text:N});return}else l={models:[{path:o}]};if(!l.models||l.models.length===0){s.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noModelsInConfig")});return}l.models.length>1&&console.warn(`[AI3D] \`\`\`3d only supports one model; ${l.models.length-1} additional models ignored. Use \`\`\`3dgrid for multi-model.`);let f=l.models[0],d=kc(n,f.path);if(!d){s.createDiv({cls:"ai3d-inline-empty",text:qi("workbench.fileNotFound",{path:f.path})});return}let h=(C=(I=d.split(".").pop())==null?void 0:I.toLowerCase())!=null?C:"";if(!Xa(h)){s.createDiv({cls:"ai3d-inline-empty",text:Gp(h)?j("codeBlock.splatDisabled"):qi("codeBlock.unsupportedFormat",{ext:`.${h}`,formats:Ml().join(", ")})});return}let u=e(),m=s.createDiv({cls:"ai3d-preview-host"});l.height&&m.style.setProperty("--min-height",typeof l.height=="number"?`${l.height}px`:l.height),l.width&&m.style.setProperty("--max-width",typeof l.width=="number"?`${l.width}px`:l.width);let _=m.createEl("canvas",{cls:"ai3d-canvas-full"});Lp(_,"inline",d),m.appendChild(_);let p=null,g=null,v=!0,x=!1,T=!1;Op(_,()=>x?null:p);let E=xv(s,m,n,()=>p,()=>d,()=>{x||(x=!0,S.disconnect(),b.disconnect(),g==null||g.destroy(),g=null,p==null||p.destroy(),p=null,m.remove())},e,()=>{if(v=!v,g){let D=m.querySelector(".ai3d-annotation-overlay");D&&D.classList.toggle("is-hidden",!v)}return v},void 0,{labelKey:"helper.toggleAnnotationsVisibilityLabel",activeTooltipKey:"helper.annotationsVisible",inactiveTooltipKey:"helper.annotationsHidden"});n$(s);let S=new MutationObserver(()=>{x||s.contains(m)||(x=!0,S.disconnect(),b.disconnect(),g==null||g.destroy(),g=null,p==null||p.destroy(),p=null)});S.observe(s,{childList:!0});async function R(){if(T||x||!d)return;T=!0;let D=Ch(m);try{D.setPhaseKey("loading.preparingModel"),await Fv(async()=>{var K,ge,Re,Be,ae,me,ne,fe;if(x||!m.isConnected){D.hide();return}let O=(K=Ka(n,d))!=null?K:void 0,V=(ge=Ka(n,t$))!=null?ge:void 0;D.setPhaseKey("loading.preparingModel");let N=await Ip({path:d,absolutePath:O,preferConversionExts:yp(u),conversionManager:()=>i$(u),convertedAssetCache:t,conversionOutputRoot:V}),F=Mv(N),B=(Re=i==null?void 0:i(d))!=null?Re:[],G={ext:F.ext,annotationMode:B.length>0?"readonly":"none",rendererRollout:u.previewRendererRollout,useThreeRenderer:u.useThreeRenderer},{preview:J}=await Ap(e$,{surface:"code-block",modelPath:d},_,G);p=J,E.syncCapabilities(),D.setPhaseKey("loading.loadingModel");let $=await ja(n,F.path),te=async Pe=>ja(n,Pe);if(x){D.hide();return}let X=await p.loadModel($,F.ext,te,F.path);if(D.setProgress(100),Pv(m,X),x){D.hide();return}if(((Be=l.scene)==null?void 0:Be.autoRotate)===void 0&&u.autoRotateDefault&&(l.scene={...l.scene,autoRotate:!0,autoRotateSpeed:u.autoRotateSpeed}),p.applyConfig(l),(ae=p.setRenderQuality)==null||ae.call(p,u.renderQuality,u.renderScale),E.syncCapabilities(),B.length>0&&zb(p)){let Pe=p.getAnnotationProvider();Pe.canvas&&(g=new pd(Pe,m,"readonly",B,void 0,Iv(n),void 0,{app:n,previewMode:u.annotationPreviewMode,displayMode:u.annotationDisplayMode}),E.showAnnotateButton(),E.updateAnnotationBadge(B.length))}h==="stl"&&f.color&&((me=p.setSTLColor)==null||me.call(p,f.color)),h==="stl"&&f.wireframe!==void 0&&((ne=p.setWireframe)==null||ne.call(p,f.wireframe)),(fe=p.hasAnimations)!=null&&fe.call(p)&&E.showAnimButton(),D.hide()})}catch(O){x=!0,S.disconnect(),b.disconnect(),D.hide(),p==null||p.destroy(),p=null,m.replaceChildren();let V=bv(O);Rv(O)?console.warn("[AI3D] Inline preview blocked by converter settings:",V.message):console.error("[AI3D] Inline preview failed:",O),Cv(m,V)}}let b=new IntersectionObserver(D=>{for(let O of D)O.isIntersecting&&(b.disconnect(),R())},{rootMargin:"200px"});b.observe(m)}}}function eSe(n){if(typeof n=="string")return{models:[{path:n}]};if(typeof n!="object"||n===null)return{models:[]};let e=n;return typeof e.path=="string"?{models:[{path:e.path,color:e.color,wireframe:e.wireframe}],camera:e.camera,lights:e.lights,scene:e.scene,stl:e.stl,width:e.width,height:e.height}:{models:Array.isArray(e.models)?e.models.filter(i=>{let r=typeof i=="string"?i:i&&typeof i=="object"&&"path"in i?i.path:void 0;return typeof r=="string"&&r.length>0}).map(i=>{if(typeof i=="string")return{path:i};let r=i;return{path:r.path,color:r.color,wireframe:r.wireframe}}):[],camera:e.camera,lights:e.lights,scene:e.scene,stl:e.stl,width:e.width,height:e.height}}function tSe(n,e,t){return{id:"3dgrid",handler:(i,r,s)=>{var T,E,S,R,b,I,C,D;let a=i.trim();if(!a){r.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noConfigSpecified")});return}let o;try{o=JSON.parse(a)}catch(O){r.createDiv({cls:"ai3d-json-error"}).createEl("pre",{text:`JSON parse error: ${String(O)}`});return}if(o.preset!=="compose"&&(!o.models||o.models.length===0)){r.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.noModelsSpecified")});return}let l=o.preset==="compose"?1:Math.max(1,(E=(T=o.models)==null?void 0:T.length)!=null?E:1),c=(I=(S=o.models)==null?void 0:S[0])!=null?I:(b=(R=o.sections)==null?void 0:R[0])==null?void 0:b.models[0],f=typeof c=="string"?c:(C=c==null?void 0:c.path)!=null?C:"",d=r.createDiv({cls:"ai3d-grid-host"}),h=d.createEl("canvas");if(bZ(h),d.appendChild(h),typeof o.rowHeight=="number"){let O=o.preset==="compose"?1:Math.ceil(l/((D=o.columns)!=null?D:Math.min(l,3)));d.style.setProperty("--grid-height",`${o.rowHeight*O}px`)}let u=null,m=!1,_=!1,p=null,g=null;MZ(h,()=>m?null:u);let v=xv(r,d,n,()=>u,()=>f,()=>{m||(m=!0,p==null||p.disconnect(),g==null||g.disconnect(),u==null||u.destroy(),u=null,d.remove())},e);n$(r),p=new MutationObserver(()=>{m||r.contains(d)||(m=!0,p==null||p.disconnect(),g==null||g.disconnect(),u==null||u.destroy(),u=null)}),p.observe(r,{childList:!0});async function x(){if(_||m)return;_=!0;let O=Ch(d);O.setPhaseKey("codeBlock.renderingGrid"),O.setProgress(-1);try{await Fv(async()=>{var $,te,X,K,ge,Re,Be,ae,me,ne;if(m||!d.isConnected){O.hide();return}let V=e(),N=[];for(let fe of($=o.models)!=null?$:[]){let Pe=await r$(n,fe,V,t);N.push(Pe)}let F=N.map(fe=>fe.model);f=(X=(te=N[0])==null?void 0:te.sourcePath)!=null?X:f;let{renderer:B}=await fw(e$,{surface:"3dgrid",preset:(K=o.preset)!=null?K:"compare",modelCount:(Re=(ge=o.models)==null?void 0:ge.length)!=null?Re:0},h);u=B,v.syncCapabilities();let G=u,J=async fe=>ja(n,fe);if(o.preset==="compose"){if(!o.sections||o.sections.length===0){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.composeRequiresSections")}),u.destroy(),u=null;return}let fe=[];for(let he of o.sections)try{if(!f){let Ye=he.models[0];if(Ye){let Et=typeof Ye=="string"?Ye:Ye.path;f=(Be=kc(n,Et))!=null?Be:Et}}let be=await $Ee(n,he,V,t);fe.push(be)}catch(be){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:be instanceof Error?be.message:String(be)}),G.destroy(),u=null;return}let Pe=rF(fe,(ae=o.direction)!=null?ae:"horizontal",Number((me=o.params)==null?void 0:me.gap)||.02,he=>typeof he=="string"?null:he,sF);if(!Pe){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:j("codeBlock.composeNoValidSections")}),G.destroy(),u=null;return}await G.loadWithPreset(Pe,J)}else if(o.preset){let fe=sF(o.preset);if(!fe){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:qi("codeBlock.unknownPreset",{preset:o.preset})}),G.destroy(),u=null;return}let Pe=fe.compute(F,(ne=o.params)!=null?ne:{});if(!Pe){O.hide(),d.createDiv({cls:"ai3d-inline-empty",text:qi("codeBlock.presetRequiresModels",{preset:o.preset,min:String(fe.minModels),max:String(fe.maxModels),count:String(F.length)})}),G.destroy(),u=null;return}await G.loadWithPreset(Pe,J)}else await G.loadModels(F,o,J);if(m){O.hide();return}O.hide()})}catch(V){m=!0,p==null||p.disconnect(),g==null||g.disconnect(),O.hide(),u==null||u.destroy(),u=null,console.error("[AI3D Grid] Failed:",V),d.createDiv({cls:"ai3d-inline-empty",text:V instanceof Error?V.message:qi("codeBlock.gridFailed",{reason:String(V)})})}}g=new IntersectionObserver(O=>{for(let V of O)V.isIntersecting&&(g==null||g.disconnect(),x())},{rootMargin:"200px"}),g.observe(d)}}}var e$,t$,a$=y(()=>{"use strict";Ya();$v();Gb();bp();vs();JQ();uw();Qb();_w();$b();Jb();yv();Mp();gn();Dv();ia();bn();r0();oF();e$=Hi("inline-code-block"),t$=".obsidian/ai-model-workbench/converted-assets"});var l$={};Ue(l$,{registerLazyCodeBlockProcessor:()=>iSe,registerLazyGridCodeBlockProcessor:()=>rSe});function o$(){return S0!=null||(S0=Promise.resolve().then(()=>(a$(),s$))),S0}function iSe(n,e,t,i){let r=null,s=async()=>(r!=null||(r=o$().then(a=>a.registerCodeBlockProcessor(n,e,t,i).handler)),r);return{id:"3d",handler:async(a,o,l)=>(await s())(a,o,l)}}function rSe(n,e,t){let i=null,r=async()=>(i!=null||(i=o$().then(s=>s.registerGridCodeBlockProcessor(n,e,t).handler)),i);return{id:"3dgrid",handler:async(s,a,o)=>(await r())(s,a,o)}}var S0,c$=y(()=>{"use strict";S0=null});function nSe(n){return n.includes("![[")}function f$(n,e){return Math.max(0,Math.min(e,n.length))}function d$(n,e,t){if(n.length===0)return!1;let i=n.lineAt(f$(n,e)),r=n.lineAt(f$(n,t));for(let s=i.number;s<=r.number;s++)if(nSe(n.line(s).text))return!0;return!1}function T0(n){if(!n.docChanged)return!1;let e=!1;return n.changes.iterChanges((t,i,r,s)=>{e||(e=d$(n.startState.doc,t,i)||d$(n.state.doc,r,s))}),e}var lF=y(()=>{"use strict"});function Bv(n){return createDiv().createDiv(n?{cls:n}:void 0)}function cF(n,e){return createDiv().createEl(n,e?{cls:e}:void 0)}var h$=y(()=>{"use strict"});var p$={};Ue(p$,{ModelEmbedWidget:()=>A0,registerLivePreviewExtension:()=>oSe});function u$(n,e,t,i,r,s,a,o,l,c,f,d,h,u,m,_){var v,x;let p="state"in n?n.state.doc:n.doc,g=[];for(let T=1;T<=p.lines;T++){let E=p.line(T),S=E.text;if(!S.includes("!["))continue;let R=0;for(;R0&&S[b-1]==="\\"){R=b+3;continue}let I=S.indexOf("]]",b+3);if(I===-1)break;let D=S.slice(b+3,I).split("|"),O=D[0].trim(),V=(x=(v=O.split(".").pop())==null?void 0:v.toLowerCase())!=null?x:"";if(!Xa(V)){R=I+2;continue}let N=400,F=300;if(D.length>1){let $=D[1].trim().match(/^(\d+)\s*x\s*(\d+)$/);$&&(N=parseInt($[1],10),F=parseInt($[2],10))}let B=kc(e,O);if(!B){R=I+2;continue}let G=E.from+b,J=E.from+I+2;g.push(Fp.Decoration.replace({widget:new A0(e,B,N,F,t,i,r,s,a,o,l,c,f,d,h,u,m,_),block:!0}).range(G,J)),R=I+2}}return g}function m$(n){return n.length===0?Lh.RangeSet.empty:Lh.RangeSet.of(n,!0)}function oSe(n,e,t,i){let r=Lh.StateField.define({create(s){let a=e(),o=u$(s,n,a.autoRotateDefault,a.enabledConverterIds,a.freecadCommand,a.obj2gltfCommand,a.fbx2gltfCommand,a.freecadcmdCommand,a.preferObj2gltfForObj,a.preferFbx2gltfForFbx,a.annotationPreviewMode,a.annotationDisplayMode,a.previewRendererRollout,a.useThreeRenderer,t,i);return m$(o)},update(s,a){if(a.docChanged){if(!T0(a))return s.map(a.changes);let o=e(),l=u$(a.state,n,o.autoRotateDefault,o.enabledConverterIds,o.freecadCommand,o.obj2gltfCommand,o.fbx2gltfCommand,o.freecadcmdCommand,o.preferObj2gltfForObj,o.preferFbx2gltfForFbx,o.annotationPreviewMode,o.annotationDisplayMode,o.previewRendererRollout,o.useThreeRenderer,t,i);return m$(l)}return s.map(a.changes)},provide:s=>Fp.EditorView.decorations.from(s)});return[Lh.Prec.highest(r)]}var Fp,Lh,sSe,aSe,A0,_$=y(()=>{"use strict";Fp=require("@codemirror/view"),Lh=require("@codemirror/state");Ya();vs();Jb();h$();ia();gn();bn();r0();lF();oF();sSe=Hi("inline-live-preview"),aSe=".obsidian/ai-model-workbench/converted-assets",A0=class extends Fp.WidgetType{constructor(t,i,r,s,a,o,l,c,f,d,h,u,m,_,p,g,v,x){super();this.app=t;this.modelPath=i;this.width=r;this.height=s;this.autoRotate=a;this.enabledConverterIds=o;this.freecadCommand=l;this.obj2gltfCommand=c;this.fbx2gltfCommand=f;this.freecadcmdCommand=d;this.preferObj2gltfForObj=h;this.preferFbx2gltfForFbx=u;this.annotationPreviewMode=m;this.annotationDisplayMode=_;this.previewRendererRollout=p;this.useThreeRenderer=g;this.convertedAssetCache=v;this.getAnnotations=x;this.preview=null;this.annotationMgr=null;this.readyObs=null;this.viewportObs=null;this.pollId=0;this.initStarted=!1;this.destroyed=!1;this.initGeneration=0;this.viewportReady=!1}eq(t){return this.modelPath===t.modelPath&&this.width===t.width&&this.height===t.height&&this.autoRotate===t.autoRotate&&this.enabledConverterIds.join("|")===t.enabledConverterIds.join("|")&&this.freecadCommand===t.freecadCommand&&this.obj2gltfCommand===t.obj2gltfCommand&&this.fbx2gltfCommand===t.fbx2gltfCommand&&this.freecadcmdCommand===t.freecadcmdCommand&&this.preferObj2gltfForObj===t.preferObj2gltfForObj&&this.preferFbx2gltfForFbx===t.preferFbx2gltfForFbx&&this.annotationPreviewMode===t.annotationPreviewMode&&this.annotationDisplayMode===t.annotationDisplayMode&&this.previewRendererRollout===t.previewRendererRollout&&this.convertedAssetCache===t.convertedAssetCache}toDOM(){let t=vr(),i=Bv("ai3d-embed-preview ai3d-cm-widget");i.setAttribute("contenteditable","false"),t&&i.classList.add("is-mobile","is-mobile-scroll-mode");let r=cF("canvas","ai3d-embed-canvas"),s=t?Math.min(this.height,220):this.height;r.style.setProperty("--ai3d-embed-height",`${s}px`),Lp(r,"live-preview",this.modelPath),Op(r,()=>this.destroyed?null:this.preview),i.appendChild(r);let a=Ch(i),o=Bv("ai3d-embed-error is-hidden");if(i.appendChild(o),t){let f=!1,d=Bv("ai3d-mobile-mode-bar"),h=Bv("ai3d-mobile-mode-hint");h.textContent=j("livePreview.mobileHint");let u=cF("button","ai3d-mobile-mode-btn");u.type="button";let m=()=>{i.classList.toggle("is-mobile-interactive",f),i.classList.toggle("is-mobile-scroll-mode",!f),u.textContent=f?j("helper.scrollAction"):j("helper.interactAction"),u.classList.toggle("ai3d-btn-active",f),u.setAttribute("aria-label",f?j("helper.disableInteractionLabel"):j("helper.enableInteractionLabel"))};u.addEventListener("click",()=>{f=!f,m()}),m(),d.append(h,u),i.appendChild(d)}let l=()=>{this.destroyed||this.initStarted||this.viewportReady&&(!i.isConnected||r.clientWidth<=0||r.clientHeight<=0||(this.initStarted=!0,this.stopReadyPoll(),this.stopReadyWatch(),this.stopViewportWatch(),this.initPreview(i,r,a,o,++this.initGeneration)))};this.readyObs=new ResizeObserver(()=>l()),this.readyObs.observe(i),this.readyObs.observe(r);let c=()=>{if(this.pollId||this.destroyed||this.initStarted)return;let f=0,d=()=>{this.pollId=0,!(this.destroyed||this.initStarted)&&(l(),!this.initStarted&&(++f>240||(this.pollId=window.requestAnimationFrame(d))))};this.pollId=window.requestAnimationFrame(d)};return typeof IntersectionObserver=="undefined"?(this.viewportReady=!0,c(),l()):(this.viewportObs=new IntersectionObserver(f=>{this.destroyed||this.initStarted||f.some(d=>d.isIntersecting||d.intersectionRatio>0)&&(this.viewportReady=!0,this.stopViewportWatch(),c(),l())},{rootMargin:"200px"}),this.viewportObs.observe(i)),i}stopReadyPoll(){this.pollId&&(window.cancelAnimationFrame(this.pollId),this.pollId=0)}async initPreview(t,i,r,s,a){var o;try{r.setPhaseKey("loading.preparingModel"),await Fv(async()=>{var R,b,I,C,D,O;if(this.destroyed||a!==this.initGeneration||!t.isConnected){r.hide();return}let[{prepareModelInput:l},{listPreferredConversionExts:c},{createLoggedModelPreview:f},{supportsAnnotationPreview:d},{AnnotationManager:h},{createNoteReader:u},{renderModelPerformanceFeedback:m}]=await Promise.all([Promise.resolve().then(()=>(Qb(),fZ)),Promise.resolve().then(()=>($b(),dZ)),Promise.resolve().then(()=>(Gb(),Qq)),Promise.resolve().then(()=>(bp(),tZ)),Promise.resolve().then(()=>($v(),JF)),Promise.resolve().then(()=>(yv(),pZ)),Promise.resolve().then(()=>(Dv(),vw))]),_=(R=Ka(this.app,this.modelPath))!=null?R:void 0;r.setPhaseKey("loading.preparingModel");let p=(b=Ka(this.app,aSe))!=null?b:void 0,g=await l({path:this.modelPath,absolutePath:_,preferConversionExts:c({preferObj2gltfForObj:this.preferObj2gltfForObj,preferFbx2gltfForFbx:this.preferFbx2gltfForFbx}),conversionManager:async()=>{let{createConversionManager:V}=await Promise.resolve().then(()=>(m0(),u0));return V({enabledConverterIds:this.enabledConverterIds,freecadCommand:this.freecadCommand,obj2gltfCommand:this.obj2gltfCommand,fbx2gltfCommand:this.fbx2gltfCommand,freecadcmdCommand:this.freecadcmdCommand})},convertedAssetCache:this.convertedAssetCache,conversionOutputRoot:p}),v=(C=(I=this.getAnnotations)==null?void 0:I.call(this,this.modelPath))!=null?C:[],x={ext:g.effectiveExt,annotationMode:v.length>0?"readonly":"none",rendererRollout:this.previewRendererRollout,useThreeRenderer:this.useThreeRenderer},{preview:T}=await f(sSe,{surface:"live-preview",modelPath:this.modelPath},i,x);if(this.destroyed||a!==this.initGeneration){T.destroy();return}this.preview=T,r.setPhaseKey("loading.loadingModel");let E=await ja(this.app,g.effectivePath);if(this.destroyed||a!==this.initGeneration){(D=this.preview)==null||D.destroy(),this.preview=null;return}let S=await this.preview.loadModel(E,g.effectiveExt,V=>ja(this.app,V),g.effectivePath);if(this.destroyed||a!==this.initGeneration){(O=this.preview)==null||O.destroy(),this.preview=null;return}if(m(t,S),this.autoRotate&&this.preview.applyConfig({models:[],scene:{autoRotate:!0,autoRotateSpeed:.5}}),v.length>0&&d(this.preview)){let V=this.preview.getAnnotationProvider();V.canvas&&(this.annotationMgr=new h(V,t,"readonly",v,void 0,u(this.app),void 0,{app:this.app,previewMode:this.annotationPreviewMode,displayMode:this.annotationDisplayMode}))}r.setProgress(100),r.hide()})}catch(l){if(this.destroyed||a!==this.initGeneration)return;(o=this.preview)==null||o.destroy(),this.preview=null,r.hide(),s.remove(),t.replaceChildren();let[{describeModelLoadFailure:c,isMissingConverterError:f},{renderModelLoadFailure:d}]=await Promise.all([Promise.resolve().then(()=>(Mp(),aZ)),Promise.resolve().then(()=>(Dv(),vw))]),h=c(l);f(l)?console.warn("[AI3D] Live Preview blocked by converter settings:",h.message):console.error("[AI3D] Live Preview failed:",l),d(t,h)}finally{r.hide()}}destroy(){var t;this.destroyed=!0,this.stopReadyPoll(),this.stopReadyWatch(),this.stopViewportWatch(),(t=this.annotationMgr)==null||t.destroy(),this.annotationMgr=null,this.preview&&(this.preview.destroy(),this.preview=null),this.initStarted=!1,this.viewportReady=!1}stopReadyWatch(){var t;(t=this.readyObs)==null||t.disconnect(),this.readyObs=null}stopViewportWatch(){var t;(t=this.viewportObs)==null||t.disconnect(),this.viewportObs=null}ignoreEvent(){return!0}}});var E$={};Ue(E$,{registerLazyLivePreviewExtension:()=>cSe});function lSe(){return x0!=null||(x0=Promise.resolve().then(()=>(_$(),p$))),x0}function g$(n,e,t,i,r,s,a,o,l,c,f,d,h,u,m,_){var v,x;let p="state"in n?n.state.doc:n.doc,g=[];for(let T=1;T<=p.lines;T++){let E=p.line(T),S=E.text;if(!S.includes("!["))continue;let R=0;for(;R0&&S[b-1]==="\\"){R=b+3;continue}let I=S.indexOf("]]",b+3);if(I===-1)break;let D=S.slice(b+3,I).split("|"),O=D[0].trim(),V=(x=(v=O.split(".").pop())==null?void 0:v.toLowerCase())!=null?x:"";if(!Xa(V)){R=I+2;continue}let N=400,F=300;if(D.length>1){let G=D[1].trim().match(/^(\d+)\s*x\s*(\d+)$/);G&&(N=parseInt(G[1],10),F=parseInt(G[2],10))}let B=kc(e,O);if(!B){R=I+2;continue}g.push(Bp.Decoration.replace({widget:new fF(e,B,N,F,t,i,r,s,a,o,l,c,f,d,h,u,m,_),block:!0}).range(E.from+b,E.from+I+2)),R=I+2}}return g}function v$(n){return n.length===0?Oh.RangeSet.empty:Oh.RangeSet.of(n,!0)}function cSe(n,e,t,i){let r=Oh.StateField.define({create(s){let a=e(),o=g$(s,n,a.autoRotateDefault,a.enabledConverterIds,a.freecadCommand,a.obj2gltfCommand,a.fbx2gltfCommand,a.freecadcmdCommand,a.preferObj2gltfForObj,a.preferFbx2gltfForFbx,a.annotationPreviewMode,a.annotationDisplayMode,a.previewRendererRollout,a.useThreeRenderer,t,i);return v$(o)},update(s,a){if(a.docChanged){if(!T0(a))return s.map(a.changes);let o=e(),l=g$(a.state,n,o.autoRotateDefault,o.enabledConverterIds,o.freecadCommand,o.obj2gltfCommand,o.fbx2gltfCommand,o.freecadcmdCommand,o.preferObj2gltfForObj,o.preferFbx2gltfForFbx,o.annotationPreviewMode,o.annotationDisplayMode,o.previewRendererRollout,o.useThreeRenderer,t,i);return v$(l)}return s.map(a.changes)},provide:s=>Bp.EditorView.decorations.from(s)});return[Oh.Prec.highest(r)]}var Bp,Oh,x0,fF,S$=y(()=>{"use strict";Bp=require("@codemirror/view"),Oh=require("@codemirror/state");Ya();vs();lF();x0=null;fF=class extends Bp.WidgetType{constructor(t,i,r,s,a,o,l,c,f,d,h,u,m,_,p,g,v,x){super();this.app=t;this.modelPath=i;this.width=r;this.height=s;this.autoRotate=a;this.enabledConverterIds=o;this.freecadCommand=l;this.obj2gltfCommand=c;this.fbx2gltfCommand=f;this.freecadcmdCommand=d;this.preferObj2gltfForObj=h;this.preferFbx2gltfForFbx=u;this.annotationPreviewMode=m;this.annotationDisplayMode=_;this.previewRendererRollout=p;this.useThreeRenderer=g;this.convertedAssetCache=v;this.getAnnotations=x;this.mountedWidget=null;this.mountedDom=null;this.viewportObs=null;this.destroyed=!1}eq(t){return this.modelPath===t.modelPath&&this.width===t.width&&this.height===t.height&&this.autoRotate===t.autoRotate&&this.enabledConverterIds.join("|")===t.enabledConverterIds.join("|")&&this.freecadCommand===t.freecadCommand&&this.obj2gltfCommand===t.obj2gltfCommand&&this.fbx2gltfCommand===t.fbx2gltfCommand&&this.freecadcmdCommand===t.freecadcmdCommand&&this.preferObj2gltfForObj===t.preferObj2gltfForObj&&this.preferFbx2gltfForFbx===t.preferFbx2gltfForFbx&&this.annotationPreviewMode===t.annotationPreviewMode&&this.annotationDisplayMode===t.annotationDisplayMode&&this.previewRendererRollout===t.previewRendererRollout&&this.useThreeRenderer===t.useThreeRenderer&&this.convertedAssetCache===t.convertedAssetCache}toDOM(){let t=activeDocument.createElement("div");return t.className="ai3d-embed-preview ai3d-cm-widget ai3d-embed-preview-lazy",t.setAttribute("contenteditable","false"),t.style.setProperty("--ai3d-embed-height",`${this.height}px`),this.watchViewport(t),t}destroy(){var t,i;this.destroyed=!0,this.stopViewportWatch(),(t=this.mountedWidget)==null||t.destroy(),this.mountedWidget=null,(i=this.mountedDom)==null||i.remove(),this.mountedDom=null}ignoreEvent(){return!0}watchViewport(t){if(typeof IntersectionObserver=="undefined"){this.mount(t);return}this.viewportObs=new IntersectionObserver(i=>{this.destroyed||this.mountedWidget||i.some(r=>r.isIntersecting||r.intersectionRatio>0)&&(this.stopViewportWatch(),this.mount(t))},{rootMargin:"240px"}),this.viewportObs.observe(t)}stopViewportWatch(){var t;(t=this.viewportObs)==null||t.disconnect(),this.viewportObs=null}async mount(t){let i;try{i=await lSe()}catch(a){console.warn("[AI3D] Failed to load Live Preview widget runtime:",a),!this.destroyed&&t.isConnected&&(t.textContent="AI3D live preview failed to load.");return}let r=new i.ModelEmbedWidget(this.app,this.modelPath,this.width,this.height,this.autoRotate,this.enabledConverterIds,this.freecadCommand,this.obj2gltfCommand,this.fbx2gltfCommand,this.freecadcmdCommand,this.preferObj2gltfForObj,this.preferFbx2gltfForFbx,this.annotationPreviewMode,this.annotationDisplayMode,this.previewRendererRollout,this.useThreeRenderer,this.convertedAssetCache,this.getAnnotations);if(this.destroyed||!t.isConnected){r.destroy();return}let s=r.toDOM();if(this.destroyed||!t.isConnected){r.destroy();return}this.mountedWidget=r,this.mountedDom=s,t.replaceWith(s)}}});var T$={};Ue(T$,{setupHeadingPinObserver:()=>dSe});function fSe(n){if(n.length===0)return"var(--interactive-accent)";if(n.length===1)return n[0];let e=100/n.length;return`linear-gradient(135deg, ${n.map((t,i)=>{let r=Math.round(i*e),s=Math.round((i+1)*e);return`${t} ${r}% ${s}%`}).join(", ")})`}function hF(n){return n.map(e=>`${e.pinId}:${e.modelPath}:${e.color}`).sort().join("|")}function dF(n){return Array.from(n.entries()).map(([e,t])=>`${e}=>${hF(t)}`).sort().join("||")}function dSe(n){let e=new Map,t=null,i=new Map,r="",s=b=>{var D;if(b===t)return!1;let I=new Map,C=t===null;for(let[O,V]of Object.entries(b)){let N=(D=V.annotations)!=null?D:[];I.set(O,N),i.get(O)!==N&&(C=!0)}return I.size!==i.size&&(C=!0),t=b,i=I,C},a=(b=n.getModelAssetProfiles())=>{let I=new Map;for(let[C,D]of Object.entries(b))for(let O of D.annotations)if(O.headingRef&&O.id){let V=Cp(O.headingRef);if(!V)continue;let N=I.get(V);N||(N=[],I.set(V,N)),N.push({pinId:O.id,modelPath:C,color:O.color})}return I},o=b=>Cp(Array.from(b.childNodes).map(I=>{var C;return I.instanceOf(Element)&&I.classList.contains("ai3d-heading-pin-badge")?"":(C=I.textContent)!=null?C:""}).join(" ")),l=b=>{let I=e.get(b);I&&(b.removeEventListener("mouseover",I.handler),I.badge.remove(),delete b.dataset.pinBound,e.delete(b))},c=(b,I)=>{if(I.length===0){l(b);return}let C=hF(I),D=e.get(b);if((D==null?void 0:D.signature)===C)return;D&&l(b),b.dataset.pinBound=C;let O=b.createSpan({cls:"ai3d-heading-pin-badge"}),V=[...new Set(I.map(J=>J.color).filter(Boolean))],N=O.createSpan({cls:"ai3d-heading-pin-badge-swatch"});if(N.style.background=fSe(V),N.title=I.length>1?j("headingPin.showMultiple"):j("headingPin.showSingle"),N.setAttribute("role","button"),N.setAttribute("tabindex","0"),I.length>1){let J=O.createSpan({cls:"ai3d-heading-pin-badge-count"});J.textContent=`\xD7${I.length}`}let F=[...new Set(I.map(J=>Qr(J.modelPath)))];O.title=qi("headingPin.linkedTo",{models:F.join(", ")});let B=J=>{J==null||J.stopPropagation(),J==null||J.preventDefault();for(let $ of I)activeDocument.dispatchEvent(new CustomEvent("ai3d-pin-highlight",{detail:{pinId:$.pinId}}))};N.addEventListener("click",J=>{B(J)}),N.addEventListener("keydown",J=>{J.instanceOf(KeyboardEvent)&&(J.key!=="Enter"&&J.key!==" "||B(J))}),O.addEventListener("click",J=>{J.stopPropagation()}),b.appendChild(O);let G=()=>{for(let J of I)activeDocument.dispatchEvent(new CustomEvent("ai3d-pin-highlight",{detail:{pinId:J.pinId}}))};b.addEventListener("mouseover",G),e.set(b,{badge:O,handler:G,signature:C})},f=(b,I)=>{var D;let C=o(b);c(b,(D=I.get(C))!=null?D:[])},d=b=>{var I;for(let[C,D]of Array.from(e.entries())){if(!C.isConnected){l(C);continue}let O=(I=b.get(o(C)))!=null?I:[],V=hF(O);(O.length===0||D.signature!==V)&&c(C,O)}},h=(b,I)=>{b.querySelectorAll(Vv).forEach(C=>f(C,I))},u=()=>{let b=n.getModelAssetProfiles();s(b);let I=a(b);r=dF(I),d(I),activeDocument.querySelectorAll(Uv).forEach(D=>h(D,I))},m=0,_=(b=0)=>{m&&window.clearTimeout(m),m=window.setTimeout(()=>{m=0,u()},b)},p=n.subscribeStore(()=>{let b=n.getModelAssetProfiles();if(!s(b))return;let I=a(b),C=dF(I);C!==r&&(r=C,_())});n.onLayoutChange(()=>{_(200)});let g=b=>b.matches(Uv)||b.matches(Vv)?!0:!!b.querySelector(Uv)||!!b.querySelector(Vv),v=b=>b.isConnected&&g(b),x=b=>g(b),T=new Set,E=0,S=()=>{var C,D,O,V,N,F;let b=Array.from(T);T.clear(),E=0;let I=a();d(I);for(let B of b)B.isConnected&&((C=B.matches)!=null&&C.call(B,Vv)&&f(B,I),(O=(D=B.querySelectorAll)==null?void 0:D.call(B,Vv))==null||O.forEach(G=>f(G,I)),(V=B.matches)!=null&&V.call(B,Uv)&&h(B,I),(F=(N=B.querySelectorAll)==null?void 0:N.call(B,Uv))==null||F.forEach(G=>h(G,I)));r=dF(I)},R=new MutationObserver(b=>{let I=!1;for(let C of b){for(let D of Array.from(C.addedNodes))D.instanceOf(HTMLElement)&&v(D)&&(T.add(D),I=!0);for(let D of Array.from(C.removedNodes))D.instanceOf(HTMLElement)&&x(D)&&(I=!0)}I&&!E&&(E=window.setTimeout(S,100))});R.observe(activeDocument.body,{childList:!0,subtree:!0}),n.registerCleanup(()=>{p(),R.disconnect(),E&&(window.clearTimeout(E),E=0),m&&(window.clearTimeout(m),m=0);for(let b of Array.from(e.keys()))l(b)}),_(500)}var Uv,Vv,A$=y(()=>{"use strict";gn();yv();vs();Uv=".markdown-preview-view, .markdown-source-view",Vv=[".markdown-preview-view h1",".markdown-preview-view h2",".markdown-preview-view h3",".markdown-preview-view h4",".markdown-preview-view h5",".markdown-preview-view h6",".cm-heading-1",".cm-heading-2",".cm-heading-3",".cm-heading-4",".cm-heading-5",".cm-heading-6",".cm-header-1",".cm-header-2",".cm-header-3",".cm-header-4",".cm-header-5",".cm-header-6"].join(", ")});var R$={};Ue(R$,{ModelFileSuggestModal:()=>uF});var x$,uF,b$=y(()=>{"use strict";x$=require("obsidian");Ya();gn();uF=class extends x$.FuzzySuggestModal{constructor(e,t){super(e),this.onChoose=t,this.setPlaceholder(j("modal.selectModel"))}getItems(){return this.app.vault.getFiles().filter(e=>{let t=e.extension.toLowerCase();return Xa(t)})}getItemText(e){return e.path}onChooseItem(e){this.onChoose(e)}}});function M$(n,e){return n==="three"?{backend:n,supportedFormats:hSe,fallbackRole:"Primary single-model preview path",capabilities:[...e],colorPipeline:"sRGB output, no tone mapping, PBR material preservation",fidelityNotes:["Direct GLB/GLTF/STL/PLY/OBJ are expected to preserve geometry scale and material color intent.","Workbench, grid, and SPLAT routes still keep Babylon fallback coverage."]}:{backend:n,supportedFormats:uSe,fallbackRole:"Capability and compatibility backend",capabilities:[...e],colorPipeline:"Babylon material pipeline with conservative fallback behavior",fidelityNotes:["3dgrid, conservative workbench, SPLAT, and converted workbench inputs remain on Babylon.","Babylon remains the rollback path when Three direct rendering is disabled."]}}function I$(n){return n.backend==="three"?M$("three",["annotation","animation","measurement","disassembly","focus-selection","wireframe","orientation-gizmo","bounding-box","render-scale","workbench"]):M$("babylon",["annotation","animation","measurement","disassembly","focus-selection","wireframe","orientation-gizmo","bounding-box","render-scale","workbench"])}function y$(n){return[`${n.backend}`,`formats=${n.supportedFormats.join("/")}`,`capabilities=${n.capabilities.join("/")||"none"}`,`role=${n.fallbackRole}`].join("; ")}var hSe,uSe,C$=y(()=>{"use strict";bp();hSe=["glb","gltf","stl","ply","obj"],uSe=["glb","gltf","stl","ply","obj","splat","converted-glb"]});var D$={};Ue(D$,{buildDiagnosticsReport:()=>xSe});function R0(n){return typeof n=="boolean"?n?"on":"off":typeof n=="number"?Number.isFinite(n)?String(n):"unknown":typeof n=="string"?n.length>0?n:"empty":"unknown"}function mSe(n){var i;let e=(i=n.split(/[\\/]/).pop())!=null?i:n,t=e.lastIndexOf(".");return t<=0||t===e.length-1?"":`.${e.slice(t+1).toLowerCase()}`}function Up(n,e,t){if(!n)return t;if(e)return n;let i=mSe(n);return i?``:""}function Gv(n,e){return n?`set (${Up(n,e,"not set")})`:"not set"}function pSe(n){let e=n.settings;return e.analysisMode==="local"?"local only":[e.analysisMode,e.serviceBaseUrl.trim()?"service configured":"service missing",`geometry ${R0(e.sendGeometrySummaryToRemote)}`,`preview refs ${R0(e.sendPreviewImagesToRemote)}`,`raw model ${e.sendRawModelToRemote?"blocked if requested":"off"}`].join(", ")}function _Se(n){let e=n.currentModelPath;return e?n.modelAssetProfiles[e]:void 0}function gSe(n){let e=n.lastKnowledgeGeneration;return e?e.status==="pending"?"pending or interrupted; rerun generation to replace the marker":e.status==="failed"?"failed; inspect console details and rerun after fixing the issue":e.warningCount>0?"completed with warnings":"none":"none"}function TSe(n){let e=new Set(n.enabledConverterIds);return vSe.map(t=>{let i=n[t.settingsKey].trim(),r=i.length===0?"command not configured":ESe.test(i)?"command configured, unsafe command rejected":"command configured, path redacted";return`${t.label}: ${e.has(t.id)?"enabled":"disabled"}, ${r}`}).join("; ")}function ASe(n){let e=n.convertedAssetRecords;if(e.length===0)return"none";let t=new Set(e.map(r=>`${r.sourcePath}:${r.sourceExt}:${r.targetExt}`)).size,i=e.filter(r=>r.warnings.length>0).length;return[`${e.length} record(s) for ${t} source(s)`,"validated before reuse for cache version, converter identity, output presence, and source freshness",i>0?`${i} record(s) carry warning text`:""].filter(Boolean).join("; ")}function xSe(n){var c,f,d,h,u,m,_,p,g;let{manifest:e,state:t}=n,i=t.settings,r=_Se(t),s=n.includeVaultPaths===!0,a=t.currentModelPath?jh({ext:(c=t.currentModelPath.split(".").pop())!=null?c:"",annotationMode:r!=null&&r.annotations.length?"readonly":"none",allowEditModeOnThree:!0,allowWorkbenchFeaturesOnThree:i.experimentalThreeWorkbench,rendererRollout:i.previewRendererRollout,useThreeRenderer:i.useThreeRenderer}):null,o=a?I$(a):null,l=t.lastKnowledgeGeneration;return["# AI Model Workbench Diagnostics","",`Generated: ${(f=n.generatedAt)!=null?f:new Date().toISOString()}`,"","## Runtime","",`- Plugin version: ${e.version}`,`- Minimum Obsidian version: ${e.minAppVersion}`,`- Obsidian API version: ${P$.apiVersion}`,`- Platform: ${vr()?"mobile":"desktop"}`,`- Locale: ${i.locale}`,"","## Renderer","",`- Use Three renderer: ${R0(i.useThreeRenderer)}`,`- Preview rollout: ${i.previewRendererRollout}`,`- Experimental Three workbench: ${R0(i.experimentalThreeWorkbench)}`,`- Current route: ${a?`${a.backend} (${a.reason})`:"no current model"}`,`- Route capability profile: ${o?y$(o):"no current model"}`,`- Route color pipeline: ${(d=o==null?void 0:o.colorPipeline)!=null?d:"no current model"}`,`- Render quality: ${i.renderQuality}`,`- Render scale: ${i.renderScale}`,"","## Current Model","",`- Path: ${Up(t.currentModelPath,s,"none")}`,`- Preview summary: ${t.modelPreview?`${t.modelPreview.meshCount} mesh(es), ${t.modelPreview.triangleCount.toLocaleString()} triangle(s), ${t.modelPreview.materialCount} material(s)`:"not captured"}`,`- Annotation count: ${(h=r==null?void 0:r.annotations.length)!=null?h:0}`,`- Registered part candidates: ${(m=(u=r==null?void 0:r.registeredParts)==null?void 0:u.length)!=null?m:0}`,`- Report note: ${Gv(r==null?void 0:r.reportNotePath,s)}`,`- Analysis sidecar: ${Gv(r==null?void 0:r.analysisSidecarPath,s)}`,`- Knowledge index: ${Gv(r==null?void 0:r.knowledgeIndexPath,s)}`,"","## Knowledge Generation","",`- Mode: ${pSe(t)}`,`- Report folder: ${Up(i.reportFolder,s,"empty")}`,`- Part notes folder: ${Up(i.partFolder,s,"empty")}`,`- Snapshot folder: ${Up(i.previewFolder,s,"empty")}`,`- Last generation: ${l?`${l.status} at ${l.generatedAt}`:"none"}`,`- Last generation attention: ${gSe(t)}`,`- Last generated model: ${Up(l==null?void 0:l.modelPath,s,"none")}`,`- Last report: ${Gv(l==null?void 0:l.reportNotePath,s)}`,`- Last index: ${Gv(l==null?void 0:l.knowledgeIndexPath,s)}`,`- Last part notes: ${(_=l==null?void 0:l.partNoteCount)!=null?_:0}`,`- Last preview images: ${(p=l==null?void 0:l.previewImageCount)!=null?p:0}`,`- Last warning count: ${(g=l==null?void 0:l.warningCount)!=null?g:0}`,"","## Conversion","",`- Enabled converters: ${i.enabledConverterIds.length?i.enabledConverterIds.join(", "):"none"}`,`- Cached conversions: ${t.convertedAssetRecords.length}`,`- Converter command status: ${TSe(i)}`,`- Conversion cache status: ${ASe(t)}`,`- Conversion timeout: ${SSe}ms outer budget`,"- Converter safety: missing converters report their converter id; unsafe configured commands are rejected before execution; command paths are redacted.",`- Supported direct/model extensions: ${Ml().join(", ")}`,"","## Notes","","- Draft service URL and command paths are intentionally omitted from this report.",s?"- Vault-relative model and note paths are included because includeVaultPaths was requested.":"- Vault-relative model, report, index, and folder paths are redacted by default.","- Attach this report with the model format, console error, and reproduction steps when filing a bug.",""].join(` `)}var P$,vSe,ESe,SSe,L$=y(()=>{"use strict";P$=require("obsidian");Ya();C$();Jv();ia();vSe=[{id:"freecad",label:"Python/CadQuery",settingsKey:"freecadCommand"},{id:"obj2gltf",label:"obj2gltf",settingsKey:"obj2gltfCommand"},{id:"fbx2gltf",label:"FBX2glTF",settingsKey:"fbx2gltfCommand"},{id:"assimp",label:"Python/trimesh",settingsKey:"assimpCommand"},{id:"freecadcmd",label:"FreeCADCmd",settingsKey:"freecadcmdCommand"}],ESe=/[;|&<>$`\r\n\t]/,SSe=3e5});var RSe={};Ue(RSe,{default:()=>b0});module.exports=z$(RSe);var hs=require("obsidian");C0();Ya();V0();var BQ=require("obsidian");gn();Xv();var v0=class extends BQ.FileView{constructor(t,i,r,s){super(t);this.getSettings=i;this.convertedAssetCache=r;this.ps=s;this.delegate=null;this.delegatePromise=null;this.closed=!1}getViewType(){return ud}getDisplayText(){var t,i;return(i=(t=this.file)==null?void 0:t.name)!=null?i:j("workbench.modelTitle")}getIcon(){return"box"}async onOpen(){this.closed=!1,this.file&&await this.onLoadFile(this.file)}async onLoadFile(t){this.closed=!1;let i=await this.ensureDelegate();!i||this.closed||(i.file=t,await i.onLoadFile(t))}async onClose(){this.closed=!0;let t=this.delegate;this.delegate=null,await(t==null?void 0:t.onClose())}async ensureDelegate(){return this.delegate?this.delegate:(this.delegatePromise||(this.delegatePromise=this.loadDelegate()),this.delegatePromise)}async loadDelegate(){this.contentEl.empty(),this.contentEl.addClass("ai3d-direct-view"),this.contentEl.createDiv({cls:"ai3d-inline-empty",text:j("loading.preparingModel")});let{DirectModelView:t}=await Promise.resolve().then(()=>(FQ(),wQ)),i=new t(this.leaf,this.getSettings,this.convertedAssetCache,this.ps);return i.contentEl=this.contentEl,i.file=this.file,this.delegatePromise=null,this.closed?(await i.onClose(),null):(this.delegate=i,i)}};Xv();var GQ=require("obsidian"),E0=class extends GQ.PluginSettingTab{constructor(t,i){super(t,i);this.plugin=i;this.delegate=null;this.delegatePromise=null}display(){this.containerEl.empty(),this.containerEl.createEl("p",{cls:"setting-item-description",text:"Loading AI Model Workbench settings..."}),this.ensureDelegate().then(t=>{t.containerEl=this.containerEl,t.display()}).catch(t=>{this.containerEl.empty(),this.containerEl.createEl("p",{cls:"setting-item-description",text:`Failed to load AI Model Workbench settings: ${String(t)}`})})}hide(){var t;(t=this.delegate)==null||t.hide()}ensureDelegate(){var t;return this.delegate?Promise.resolve(this.delegate):((t=this.delegatePromise)!=null||(this.delegatePromise=Promise.resolve().then(()=>(VQ(),UQ)).then(({AI3DSettingTab:i})=>{let r=new i(this.app,this.plugin);return this.delegate=r,this.delegatePromise=null,r}).catch(i=>{throw this.delegatePromise=null,i})),this.delegatePromise)}};bn();gn();ia();var mF=Hi("main");function kv(n,e){return()=>{n().catch(t=>{mF.error(`Command ${e} failed`,{error:String(t)}),new hs.Notice(`AI3D: ${e} failed \u2014 ${String(t)}`,5e3)})}}var b0=class extends hs.Plugin{constructor(){super(...arguments);this.unloaded=!1;this.headingPinObserverStarted=!1}getSettings(){return this.ps.store.getState().settings}updateSettings(t){this.ps.updateSettings(t),dw(this.getSettings().logLevel),Hp(this.getSettings().locale)}async onload(){var c;if(this.unloaded=!1,this.ps=PF(this),await this.ps.load(),this.convertedAssetCache=AF(this.ps.store.getState().convertedAssetRecords,f=>this.ps.setConvertedAssetRecords(f)),dw(this.getSettings().logLevel),!this.ps.localeLoadedFromSaved){let d=((c=navigator.language)!=null?c:"en").startsWith("zh")?"zh-CN":"en";this.updateSettings({locale:d})}Hp(this.getSettings().locale),this.addRibbonIcon("box",j("main.commandImportModel"),()=>this.importModel()),this.addCommand({id:"import-model",name:j("main.commandImportModel"),callback:()=>this.importModel()}),this.addCommand({id:"generate-note",name:j("main.commandGenerateNote"),callback:kv(()=>this.generateNote(),"generate note")}),this.addCommand({id:"open-knowledge-index",name:j("main.commandOpenKnowledgeIndex"),callback:kv(()=>this.openKnowledgeIndex(),"open knowledge index")}),this.addCommand({id:"clear-conversion-cache",name:j("main.commandClearConversionCache"),callback:kv(()=>Promise.resolve(this.clearConversionCache()),"clear conversion cache")}),this.addCommand({id:"check-converters",name:j("main.commandCheckConverters"),callback:kv(()=>this.checkConverterCommands(),"check converters")}),this.addCommand({id:"copy-diagnostics-report",name:j("main.commandCopyDiagnostics"),callback:kv(()=>this.copyDiagnosticsReport(),"copy diagnostics")}),this.addSettingTab(new E0(this.app,this)),this.registerView(ud,f=>new v0(f,()=>this.getSettings(),this.convertedAssetCache,this.ps)),this.registerExtensions(Ml(),ud);let t=f=>{var d,h;return(h=(d=this.ps.store.getState().modelAssetProfiles[f])==null?void 0:d.annotations)!=null?h:[]},[{registerLazyCodeBlockProcessor:i,registerLazyGridCodeBlockProcessor:r},{registerLazyLivePreviewExtension:s}]=await Promise.all([Promise.resolve().then(()=>(c$(),l$)),Promise.resolve().then(()=>(S$(),E$))]),a=i(this.app,()=>this.getSettings(),this.convertedAssetCache,t);this.registerMarkdownCodeBlockProcessor(a.id,a.handler);let o=r(this.app,()=>this.getSettings(),this.convertedAssetCache);this.registerMarkdownCodeBlockProcessor(o.id,o.handler);let l=s(this.app,()=>this.getSettings(),this.convertedAssetCache,t);for(let f of l)this.registerEditorExtension(f);this.app.workspace.onLayoutReady(()=>{window.setTimeout(()=>{this.startHeadingPinObserver()},0)})}onunload(){this.unloaded=!0,this.ps.dispose()}async startHeadingPinObserver(){if(!(this.unloaded||this.headingPinObserverStarted)){this.headingPinObserverStarted=!0;try{let{setupHeadingPinObserver:t}=await Promise.resolve().then(()=>(A$(),T$));if(this.unloaded)return;t({subscribeStore:i=>this.ps.store.subscribe(i),getModelAssetProfiles:()=>this.ps.store.getState().modelAssetProfiles,registerCleanup:i=>this.register(i),onLayoutChange:i=>{this.registerEvent(this.app.workspace.on("layout-change",i))}})}catch(t){this.headingPinObserverStarted=!1,console.warn("[AI3D] Failed to start heading pin observer:",t)}}}importModel(){this.showImportModelModal().catch(t=>{mF.error("Failed to open import modal",{error:String(t)}),new hs.Notice(`AI3D: failed to open import modal - ${String(t)}`,5e3)})}async showImportModelModal(){let{ModelFileSuggestModal:t}=await Promise.resolve().then(()=>(b$(),R$));new t(this.app,i=>{let r=i.extension.toLowerCase();Xa(r)&&this.openModelFile(i)}).open()}async openModelFile(t){this.ps.setCurrentModel(t.path,null),await this.app.workspace.getLeaf(!0).openFile(t,{active:!0})}async generateNote(){let{generateKnowledgeNote:t}=await Promise.resolve().then(()=>(_0(),p0));await t(this.app,this.ps)}async openKnowledgeIndex(){let t=this.resolveKnowledgeIndexPath();if(!t){new hs.Notice(j("workbench.noIndexYet"));return}let i=this.app.vault.getAbstractFileByPath(t);i instanceof hs.TFile?await this.app.workspace.getLeaf(!0).openFile(i,{active:!0}):new hs.Notice(qi("workbench.fileNotFound",{path:t}))}resolveKnowledgeIndexPath(){var a,o,l;let t=this.ps.store.getState(),i=t.currentModelPath,r=i?(a=t.modelAssetProfiles[i])==null?void 0:a.knowledgeIndexPath:void 0;return r||((o=t.lastKnowledgeGeneration)!=null&&o.knowledgeIndexPath?t.lastKnowledgeGeneration.knowledgeIndexPath:(l=Object.values(t.modelAssetProfiles).filter(c=>!!c.knowledgeIndexPath).sort((c,f)=>Date.parse(f.updatedAt)-Date.parse(c.updatedAt))[0])==null?void 0:l.knowledgeIndexPath)}clearConversionCache(){this.convertedAssetCache.clear(),new hs.Notice("AI 3d conversion cache cleared.")}async checkConverterCommands(){if(vr()){new hs.Notice(j("main.converterDiagnosticsMobileUnavailable"),8e3);return}let{inspectAllConverterCommands:t}=await Promise.resolve().then(()=>(fd(),Nw)),i=await t(this.getSettings()),r=i.filter(a=>a.available).map(a=>a.label),s=i.filter(a=>!a.available).map(a=>a.label);if(s.length===0){new hs.Notice(`AI 3D converter diagnostics: all commands available (${r.join(", ")}).`,8e3);return}new hs.Notice(`AI 3D converter diagnostics: available ${r.join(", ")||"none"}; missing ${s.join(", ")}.`,1e4)}async copyDiagnosticsReport(){let{buildDiagnosticsReport:t}=await Promise.resolve().then(()=>(L$(),D$)),i=t({manifest:this.manifest,state:this.ps.store.getState()});try{await navigator.clipboard.writeText(i),new hs.Notice(j("main.diagnosticsCopied"),8e3)}catch(r){let s=this.getSettings().reportFolder.replace(/\\/g,"/").replace(/^\/+|\/+$/g,"").trim()||"Analysis/3D Reports";await this.ensureVaultFolder(s);let a=`AI Model Workbench Diagnostics ${new Date().toISOString().replace(/[:.]/g,"-")}.md`,o=await this.app.vault.create(`${s}/${a}`,i);await this.app.workspace.getLeaf(!0).openFile(o,{active:!0}),new hs.Notice(j("main.diagnosticsCopyFailed"),1e4)}}async ensureVaultFolder(t){let i="";for(let r of t.split("/").filter(Boolean))i=i?`${i}/${r}`:r,this.app.vault.getAbstractFileByPath(i)||await this.app.vault.createFolder(i).catch(s=>{mF.warn("Failed to create vault folder",{path:i,error:String(s)})})}}; diff --git a/src/view/inline/lazy-live-preview.ts b/src/view/inline/lazy-live-preview.ts index e97bdbc..576902b 100644 --- a/src/view/inline/lazy-live-preview.ts +++ b/src/view/inline/lazy-live-preview.ts @@ -1,6 +1,6 @@ /** * Lightweight CM6 extension for Live Preview embeds. - * The full model widget is imported only when an embed is mounted into the DOM. + * The full model widget is imported only when an embed approaches the viewport. */ import type { App } from "obsidian"; @@ -25,6 +25,7 @@ function loadLivePreviewModule(): Promise { class LazyModelEmbedWidget extends WidgetType { private mountedWidget: LivePreviewWidget | null = null; private mountedDom: HTMLElement | null = null; + private viewportObs: IntersectionObserver | null = null; private destroyed = false; constructor( @@ -75,13 +76,15 @@ class LazyModelEmbedWidget extends WidgetType { const placeholder = activeDocument.createElement("div"); placeholder.className = "ai3d-embed-preview ai3d-cm-widget ai3d-embed-preview-lazy"; placeholder.setAttribute("contenteditable", "false"); + placeholder.style.setProperty("--ai3d-embed-height", `${this.height}px`); - void this.mount(placeholder); + this.watchViewport(placeholder); return placeholder; } override destroy(): void { this.destroyed = true; + this.stopViewportWatch(); this.mountedWidget?.destroy(); this.mountedWidget = null; this.mountedDom?.remove(); @@ -92,6 +95,26 @@ class LazyModelEmbedWidget extends WidgetType { return true; } + private watchViewport(placeholder: HTMLElement): void { + if (typeof IntersectionObserver === "undefined") { + void this.mount(placeholder); + return; + } + + this.viewportObs = new IntersectionObserver((entries) => { + if (this.destroyed || this.mountedWidget) return; + if (!entries.some((entry) => entry.isIntersecting || entry.intersectionRatio > 0)) return; + this.stopViewportWatch(); + void this.mount(placeholder); + }, { rootMargin: "240px" }); + this.viewportObs.observe(placeholder); + } + + private stopViewportWatch(): void { + this.viewportObs?.disconnect(); + this.viewportObs = null; + } + private async mount(placeholder: HTMLElement): Promise { let module: LivePreviewModule; try { diff --git a/styles.css b/styles.css index 8223272..df466bc 100644 --- a/styles.css +++ b/styles.css @@ -970,6 +970,10 @@ body { border-radius: var(--radius-m); } +.ai3d-embed-preview-lazy { + min-height: var(--ai3d-embed-height, 300px); +} + .ai3d-embed-canvas { display: block; width: 100%;