diff --git a/main.js b/main.js index edf5775..8bb7e2d 100644 --- a/main.js +++ b/main.js @@ -18,7 +18,7 @@ ${n}`}function Ae(e,t,n){return wn(e)?e.userMessage:e instanceof Error?{rawMessa `,i=t.split(/\r?\n/),a=[...n].sort((o,u)=>u.blockStartLine-o.blockStartLine);for(let o of a)this.applyWrite(i,o);return i.join(r)}applyWrite(t,n){ft(t,{contentEndLine:n.contentEndLine,blockEndLine:n.blockEndLine,markerLine:n.markerLine,markerIndent:n.markerIndent,renderedMarker:gt(n.noteId,n.itemToSlot,n.freeSlots),additionalRemovalLineIndexes:Jo(t,n.blockStartLine,n.blockEndLine)})}};function gt(e,t,n){Dn(t,n);let r=Object.entries(t).sort((a,o)=>a[1]-o[1]||a[0].localeCompare(o[0])).map(([a,o])=>`${a}:${o}`).join(","),i=[...new Set(n)].sort((a,o)=>a-o).join(",");return``}function Yo(e){if(!e.trim())return{};let t={},n=new Set;for(let r of e.split(",")){let i=r.trim();if(!i)continue;let[a,o]=i.split(":");if(!a||!o||!Zo.test(a))throw new $(`Invalid GI item mapping entry: ${r}`);let u=Number(o);if(!Number.isInteger(u)||u<1)throw new $(`Invalid GI slot value: ${o}`);if(t[a]!==void 0||n.has(u))throw new $(`Duplicate GI mapping entry detected: ${r}`);t[a]=u,n.add(u)}return t}function Xo(e){if(!e.trim())return[];let t=[],n=new Set;for(let r of e.split(",")){let i=r.trim();if(!i)continue;let a=Number(i);if(!Number.isInteger(a)||a<1)throw new $(`Invalid GI free slot value: ${i}`);if(n.has(a))throw new $(`Duplicate GI free slot detected: ${i}`);n.add(a),t.push(a)}return t.sort((r,i)=>r-i)}function Dn(e,t){let n=new Set;for(let r of Object.values(e)){if(!Number.isInteger(r)||r<1)throw new $(`GI item slot must be a positive integer. Received: ${r}`);n.add(r)}for(let r of t){if(!Number.isInteger(r)||r<1)throw new $(`GI free slot must be a positive integer. Received: ${r}`);if(n.has(r))throw new $(`GI free slot ${r} overlaps with an occupied slot.`)}}function Jo(e,t,n){let r=[];for(let i=t;io.noteId)),new Set(r.map(o=>o.noteId)),this.cardMarkerService,this.groupMarkerService);try{return a.nextContent!==i.content&&await this.vaultGateway.replaceMarkdownFile(t,i.content,a.nextContent),{removedCardMarkers:a.removedCardMarkers,removedGroupMarkers:a.removedGroupMarkers,removedMarkers:a.removedCardMarkers+a.removedGroupMarkers,conflictFiles:[],failureFiles:[]}}catch(o){return o instanceof fe?{...mt(),conflictFiles:[t]}:{...mt(),failureFiles:[ot(t,o)]}}}};function eu(e,t,n,r,i){let a=e.includes(`\r `)?`\r `:` -`,o=e.split(/\r?\n/),u=[],s=0,c=0;for(let d=0;d0||r.trackedGroups.length>0}async execute(t){let n=await this.pluginStateRepository.load(),r=yi(n,t);if(r.trackedCards.length===0&&r.trackedGroups.length===0)return nu();let i=r.noteIds;i.length>0&&await this.ankiGateway.deleteNotes(i);let a=await this.markdownMarkerRemovalService.remove(t,r.trackedCards.map(u=>({noteId:u.noteId})),r.trackedGroups.map(u=>({noteId:u.noteId,groupId:u.groupId,blockStartLine:u.blockStartLine}))),o=tu(n,t,r);return await this.pluginStateRepository.save(o),{trackedCards:r.trackedCards.length,trackedGroups:r.trackedGroups.length,deletedNotes:i.length,removedMarkers:a.removedMarkers,removedCardMarkers:a.removedCardMarkers,removedGroupMarkers:a.removedGroupMarkers,deletedLocalRecords:r.trackedCards.length+r.trackedGroups.length,conflictFiles:a.conflictFiles,failureFiles:a.failureFiles}}};function yi(e,t){let n=new Set,r=new Set,i=e.groupBlocks??{};for(let u of e.files[t]?.noteIds??[]){let s=N(u);e.cards[s]&&n.add(s)}for(let u of e.files[t]?.groupIds??[])i[u]&&r.add(u);for(let u of Object.values(e.cards))u.filePath===t&&n.add(N(u.noteId));for(let[u,s]of Object.entries(i))s.filePath===t&&r.add(u);let a=Array.from(n).map(u=>e.cards[u]).filter(u=>!!u),o=Array.from(r).map(u=>i[u]).filter(u=>!!u);return{trackedCards:a,trackedGroups:o,noteIds:Array.from(new Set([...a.map(u=>u.noteId),...o.map(u=>u.noteId)]))}}function tu(e,t,n){let r={...e.cards},i={...e.groupBlocks??{}};for(let o of n.trackedCards)delete r[N(o.noteId)];for(let o of n.trackedGroups)delete i[o.groupId];let a={...e.files};return delete a[t],{files:a,cards:r,groupBlocks:e.groupBlocks?i:void 0,pendingWriteBack:e.pendingWriteBack.filter(o=>o.filePath!==t)}}function nu(){return{trackedCards:0,trackedGroups:0,deletedNotes:0,removedMarkers:0,removedCardMarkers:0,removedGroupMarkers:0,deletedLocalRecords:0,conflictFiles:[],failureFiles:[]}}var bt=class{constructor(t){this.manualSyncService=t}async execute(t,n){return this.manualSyncService.syncFile(t,n)}};var yt=class{constructor(t){this.manualSyncService=t}async execute(t){return this.manualSyncService.rebuildIndex(t)}};var xt=class{constructor(t){this.manualSyncService=t}async execute(t){return this.manualSyncService.syncVault(t)}};var Si=require("obsidian");function xi(e,t){return{model:{name:e,...t}}}var St=class{constructor(t){this.getBaseUrl=t}async ensureDeckExists(t){await this.invoke("createDeck",{deck:t})}async ensureDecks(t){let n=Array.from(new Set(t));await this.invokeMulti(n.map(r=>({action:"createDeck",params:{deck:r}})))}async listNoteModels(){return this.invoke("modelNames",{})}async listDeckNames(){let t=await this.invoke("deckNamesAndIds",{});return Object.keys(t)}async getModelFieldNames(t){return this.invoke("modelFieldNames",{modelName:t})}async getModelFieldNamesByModelNames(t){let n=Array.from(new Set(t.map(i=>i.trim()).filter(i=>i.length>0)));if(n.length===0)return{};let r=await this.invoke("multi",{actions:n.map(i=>({action:"modelFieldNames",params:{modelName:i}}))});return n.reduce((i,a,o)=>{let u=ru(r[o]);return u&&(i[a]=u),i},{})}async getModelTemplates(t){let n=await this.invoke("modelTemplates",{modelName:t});return Object.fromEntries(Object.entries(n).map(([r,i])=>[r,{name:r,front:i.Front??"",back:i.Back??""}]))}async getModelStyling(t){let n=await this.invoke("modelStyling",{modelName:t});return typeof n=="string"?n:n.css??""}async createModel(t){await this.invoke("createModel",{modelName:t.modelName,inOrderFields:t.fieldNames,css:t.css,isCloze:!!t.isCloze,cardTemplates:t.templates.map(n=>({Name:n.name,Front:n.front,Back:n.back}))})}async addModelField(t,n){await this.invoke("modelFieldAdd",{modelName:t,fieldName:n})}async addModelTemplate(t,n){await this.invoke("modelTemplateAdd",{modelName:t,templateName:n.name,Front:n.front,Back:n.back})}async updateModelTemplate(t,n){await this.invoke("updateModelTemplates",xi(t,{templates:{[n.name]:{Front:n.front,Back:n.back}}}))}async updateModelStyling(t,n){await this.invoke("updateModelStyling",xi(t,{css:n}))}async findNoteIds(t){return this.invoke("findNotes",{query:t})}async getNoteDetails(t){if(t.length===0)return[];let n=await this.invoke("notesInfo",{notes:t}),r=n.flatMap(a=>Array.isArray(a?.cards)?a.cards:[]),i=new Map;if(r.length>0){let a=await this.invoke("cardsInfo",{cards:r});for(let o of a)!o||typeof o.cardId!="number"||typeof o.deckName!="string"||i.set(o.cardId,o.deckName)}return n.flatMap(a=>{if(!a||typeof a.noteId!="number"||typeof a.modelName!="string")return[];let o=Array.isArray(a.cards)?a.cards:[],u=Object.fromEntries(Object.entries(a.fields??{}).map(([s,c])=>[s,c?.value??""]));return[{noteId:a.noteId,modelName:a.modelName,cardIds:o,deckNames:Array.from(new Set(o.map(s=>i.get(s)).filter(s=>typeof s=="string"))),tags:Array.isArray(a.tags)?a.tags.filter(s=>typeof s=="string"):[],fields:u}]})}async getModelDetails(t){let n=await this.getModelFieldNames(t),r=t.toLowerCase().includes("cloze");try{let i=await this.getModelTemplates(t);r=r||Object.keys(i).some(a=>a.toLowerCase().includes("cloze"))}catch{r=r||n.some(i=>i.toLowerCase()==="text")}return{fieldNames:n,isCloze:r}}async getDeckStats(t){if(t.length===0)return[];let n=await this.invoke("deckNamesAndIds",{}),r=await this.invoke("getDeckStats",{decks:t});return t.map(i=>({deckName:i,noteCount:iu(r,n[i])}))}async getNoteSummaries(t){return(await this.getNoteDetails(t)).map(n=>({noteId:n.noteId,modelName:n.modelName,cardIds:n.cardIds,deckNames:n.deckNames,tags:n.tags}))}async addNote(t){return this.invoke("addNote",{note:{deckName:t.deckName,modelName:t.modelName,fields:t.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:t.tags}})}async addNotes(t){return this.invokeMulti(t.map(n=>({action:"addNote",params:{note:{deckName:n.deckName,modelName:n.modelName,fields:n.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:n.tags}}})))}async deleteNotes(t){t.length!==0&&await this.invoke("deleteNotes",{notes:t})}async updateNote(t){if(await this.invoke("updateNoteFields",{note:{id:t.noteId,fields:t.fields}}),!t.deckName)return;let r=(await this.invoke("notesInfo",{notes:[t.noteId]}))[0]?.cards??[];r.length>0&&await this.invoke("changeDeck",{cards:r,deck:t.deckName})}async updateNoteModel(t){try{await this.invoke("updateNoteModel",{note:{id:t.noteId,modelName:t.modelName,fields:t.fields}})}catch(n){throw new Error(au("updateNoteModel",{noteId:t.noteId,modelName:t.modelName},n))}}async updateNotes(t){await this.invokeMulti(t.map(n=>({action:"updateNoteFields",params:{note:{id:n.noteId,fields:n.fields}}})))}async syncNoteTags(t){let n=[];for(let r of t)r.removeTags.length>0&&n.push({action:"removeTags",params:{notes:[r.noteId],tags:r.removeTags.join(" ")}}),r.addTags.length>0&&n.push({action:"addTags",params:{notes:[r.noteId],tags:r.addTags.join(" ")}});await this.invokeMulti(n)}async changeDecks(t){await this.invokeMulti(t.filter(n=>n.cardIds.length>0).map(n=>({action:"changeDeck",params:{cards:n.cardIds,deck:n.deckName}})))}async deleteDecks(t){let n=Array.from(new Set(t));n.length!==0&&await this.invoke("deleteDecks",{decks:n,cardsToo:!0})}async storeMedia(t){await this.invoke("storeMediaFile",{filename:t.fileName,path:t.absolutePath})}async storeMediaFiles(t){await this.invokeMulti(t.map(n=>({action:"storeMediaFile",params:{filename:n.fileName,path:n.absolutePath}})))}async invoke(t,n){let i=(await(0,Si.requestUrl)({url:this.getBaseUrl(),method:"POST",contentType:"application/json",body:JSON.stringify({action:t,version:6,params:n})})).json;if(i.error)throw new Error(i.error);return i.result}async invokeMulti(t){return t.length===0?[]:this.invoke("multi",{actions:t})}};function ru(e){if(Array.isArray(e))return e.filter(n=>typeof n=="string");if(!e||typeof e!="object"||Array.isArray(e))return;let t=e;if(!t.error&&Array.isArray(t.result))return t.result.filter(n=>typeof n=="string")}function iu(e,t){if(!e||typeof e!="object"||typeof t!="number")return;let n=e[String(t)];if(!n||typeof n!="object")return;let i=n.total_in_deck;if(typeof i=="number"&&Number.isFinite(i))return i}function au(e,t,n){let r=typeof t.noteId=="number"&&typeof t.modelName=="string"?` for note ${t.noteId} to model ${t.modelName}`:typeof t.noteId=="number"?` for note ${t.noteId}`:"";return`AnkiConnect ${e} failed${r}: ${ou(n)}`}function ou(e){return e instanceof Error&&e.message.trim().length>0?e.message.trim():String(e)}var Ct=class{constructor(t){this.plugin=t}async load(){return await this.plugin.loadData()??null}async save(t){await this.plugin.saveData(t)}};var ue=require("obsidian");function z(e){let t=2166136261;for(let n=0;n>>0).toString(16).padStart(8,"0")}function Mt(e){if(!e)return[];let t=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let a=(r.startsWith("#")?r.slice(1):r).split("/").map(u=>u.trim()).filter(u=>u.length>0);if(a.length===0)continue;let o=a.join("::");n.has(o)||(n.add(o),t.push(o))}return t}var uu=new Set(["png","jpg","jpeg","gif","bmp","svg","webp","tiff"]),su=new Set(["wav","m4a","flac","mp3","wma","aac","webm","ogg"]),vt=class{constructor(t){this.app=t}async listFolderTree(){return this.app.vault.getRoot().children.filter(t=>t instanceof ue.TFolder).map(t=>this.toFolderTreeNode(t))}async listMarkdownFileRefs(){return this.app.vault.getMarkdownFiles().map(t=>({path:t.path,basename:t.basename,mtime:t.stat.mtime,size:t.stat.size}))}async listMarkdownFiles(){let t=this.app.vault.getMarkdownFiles();return Promise.all(t.map(n=>this.toSourceFile(n)))}async getMarkdownFile(t){let n=this.app.vault.getAbstractFileByPath(t);return!(n instanceof ue.TFile)||n.extension.toLowerCase()!=="md"?null:this.toSourceFile(n)}async readMarkdownFile(t){return this.getMarkdownFile(t)}async replaceMarkdownFile(t,n,r){let i=this.app.vault.getAbstractFileByPath(t);if(!(i instanceof ue.TFile)||i.extension.toLowerCase()!=="md")throw new pt(t);if(await this.app.vault.cachedRead(i)!==n)throw new fe(t);await this.app.vault.modify(i,r)}resolveWikiLink(t,n){let{alias:r,linkPath:i}=Ci(t),o=this.app.metadataCache.getFirstLinkpathDest(wt(i),n)?.path??wt(i),u=r||cu(i);return{url:this.createObsidianUrl(i.includes("#")?`${o}${i.slice(i.indexOf("#"))}`:o),displayText:u}}resolveEmbed(t,n){let{alias:r,linkPath:i}=Ci(t),a=this.app.metadataCache.getFirstLinkpathDest(wt(i),n);if(!(a instanceof ue.TFile))return null;let o=a.extension.toLowerCase(),u=uu.has(o)?"image":su.has(o)?"audio":null;if(!u)return null;let s=du(this.app,a.path),c=`${z(a.path)}-${a.name}`;return{kind:u,fileName:c,absolutePath:s,altText:r||a.name}}createBacklink(t){return this.createObsidianUrl(`${t.filePath}#${lu(t.headingText)}`)}async toSourceFile(t){let n=this.app.metadataCache.getFileCache(t);return{path:t.path,basename:t.basename,content:await this.app.vault.cachedRead(t),tags:pu(n)}}createObsidianUrl(t){return`obsidian://open?vault=${encodeURIComponent(this.app.vault.getName())}&file=${encodeURIComponent(t)}`}toFolderTreeNode(t){return{path:t.path,name:t.name,children:t.children.filter(n=>n instanceof ue.TFolder).map(n=>this.toFolderTreeNode(n))}}};function Ci(e){let[t,n]=e.split("|",2).map(r=>r.trim());return{linkPath:t,alias:n||void 0}}function wt(e){return e.split("#",1)[0]}function cu(e){let t=wt(e);return(t.split("/").pop()??t).replace(/\.[^.]+$/,"")||e}function du(e,t){let n=e.vault.adapter;if(!n.getFullPath)throw new Error("The active vault adapter does not expose an absolute filesystem path.");return n.getFullPath(t)}function lu(e){return e.replace(/(?:\s+#\S+)+$/g,t=>t.replace(/(^|\s)#(\S+)/g,"$1$2"))}function pu(e){return e?Mt((0,ue.getAllTags)(e)):[]}var Ft=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{},n=di(t.settings);return oe(n),n}async save(t){let n=ke(t);oe(n);let r=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...r,settings:n})}};var Tt=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{};return fu(t.pluginState)}async save(t){let n=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...n,pluginState:t})}};function fu(e){if(!e)return bi();let t=e.cards??{},n={};for(let a of Object.values(t)){let o=At(a.noteId);if(o===void 0)continue;let u=gu(a,o),s=N(o),c=n[s];(!c||c.lastSyncedAt<=u.lastSyncedAt)&&(n[s]=u)}let r={};for(let[a,o]of Object.entries(e.files??{}))r[a]={filePath:a,fileHash:typeof o.fileHash=="string"?o.fileHash:"",fileStamp:typeof o.fileStamp=="string"?o.fileStamp:"",deckRulesFingerprint:typeof o.deckRulesFingerprint=="string"?o.deckRulesFingerprint:void 0,lastIndexedAt:typeof o.lastIndexedAt=="number"?o.lastIndexedAt:0,noteIds:ku(o,t,n),groupIds:bu(o,e.groupBlocks??{})};let i={};for(let[a,o]of Object.entries(e.groupBlocks??{})){let u=hu(o,a);if(!u)continue;let s=i[a];(!s||s.lastSyncedAt<=u.lastSyncedAt)&&(i[a]=u)}return{files:r,cards:n,groupBlocks:i,pendingWriteBack:[]}}function gu(e,t){return{noteId:t,filePath:typeof e.filePath=="string"?e.filePath:"",heading:typeof e.heading=="string"?e.heading:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.heading=="string"?e.heading:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,bodyMarkdown:typeof e.bodyMarkdown=="string"?e.bodyMarkdown:"",cardType:mu(e.cardType),blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",renderConfigHash:typeof e.renderConfigHash=="string"?e.renderConfigHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(n=>typeof n=="string"):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}}function mu(e){return e==="cloze"||e==="semantic-qa"?e:"basic"}function hu(e,t){let n=At(e.noteId);return n===void 0||!t.trim()?null:{groupId:t,noteId:n,filePath:typeof e.filePath=="string"?e.filePath:"",headingText:typeof e.headingText=="string"?e.headingText:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.headingText=="string"?e.headingText:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,stem:typeof e.stem=="string"?e.stem:"",src:typeof e.src=="string"?e.src:"",blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,markerIndent:typeof e.markerIndent=="string"?e.markerIndent:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(r=>typeof r=="string"):[],items:Array.isArray(e.items)?e.items.flatMap(r=>{if(!r||typeof r!="object")return[];let i=r;return typeof i.title!="string"||typeof i.answer!="string"||typeof i.ordinalInMarkdown!="number"?[]:[{itemId:typeof i.itemId=="string"?i.itemId:void 0,title:i.title,answer:i.answer,slot:typeof i.slot=="number"?i.slot:void 0,ordinalInMarkdown:i.ordinalInMarkdown}]}):[],freeSlots:Array.isArray(e.freeSlots)?e.freeSlots.filter(r=>typeof r=="number"&&Number.isInteger(r)&&r>0):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}}function ku(e,t,n){let r=new Set;if(Array.isArray(e.noteIds))for(let i of e.noteIds){let a=At(i);a!==void 0&&n[N(a)]&&r.add(a)}if(Array.isArray(e.cardIds))for(let i of e.cardIds){let a=At(t[i]?.noteId);a!==void 0&&n[N(a)]&&r.add(a)}return Array.from(r)}function bu(e,t){return Array.isArray(e.groupIds)?e.groupIds.filter(n=>typeof n=="string"&&!!t[n]):[]}function At(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:void 0}function Mi(e){e.addCommand({id:"sync-current-file-to-anki",name:m("commands.syncCurrentFileToAnki"),callback:()=>{e.runSyncCurrentFile()}}),e.addCommand({id:"sync-vault-to-anki",name:m("commands.syncVaultToAnki"),callback:()=>{e.runSyncVault()}}),e.addCommand({id:"rebuild-card-index",name:m("commands.rebuildCardIndex"),callback:()=>{e.runRebuildCardIndex()}}),e.addCommand({id:"clear-current-file-synced-cards",name:m("commands.clearCurrentFileSyncedCards"),callback:()=>{e.runClearCurrentFileSyncedCards()}}),e.addCommand({id:"cleanup-empty-decks",name:m("commands.cleanupEmptyDecks"),callback:()=>{e.runCleanupEmptyDecks()}})}var Ve=require("obsidian");var Dt=class extends Ve.Modal{constructor(n,r){super(n);this.candidateDeckNames=r;this.deckToggles=new Map;this.selectedDeckNames=new Set;this.resolvedValue=null}openAndGetSelection(){return new Promise(n=>{this.resolver=n,this.open()})}onOpen(){let{contentEl:n}=this;n.empty(),n.createEl("h2",{text:m("modal.emptyDeck.title")}),n.createEl("p",{text:m("modal.emptyDeck.description")});for(let i of this.candidateDeckNames)new Ve.Setting(n).setName(i).addToggle(a=>{this.deckToggles.set(i,a),a.setValue(!1).onChange(o=>{o?this.selectedDeckNames.add(i):this.selectedDeckNames.delete(i),this.refreshSelectionState()})});let r=new Ve.Setting(n).addButton(i=>{i.setButtonText(m("modal.emptyDeck.selectAll")).onClick(()=>{this.selectAllDecks()})}).addButton(i=>{i.setButtonText(m("modal.emptyDeck.clearAll")).onClick(()=>{this.clearSelectedDecks()})}).addButton(i=>{i.setButtonText(m("modal.emptyDeck.invert")).onClick(()=>{this.invertSelectedDecks()})}).addButton(i=>{i.setButtonText(m("modal.emptyDeck.cancel")).onClick(()=>{this.finish(null)})}).addButton(i=>{this.deleteButton=i,i.setButtonText(m("modal.emptyDeck.deleteSelected")).setCta().onClick(()=>{this.finish(Array.from(this.selectedDeckNames))})});this.selectionCountEl=r.settingEl.createEl("span",{text:this.getSelectionCountText()}),this.selectionCountEl.addClass("anki-helper-empty-deck-selection-count"),this.refreshSelectionState()}onClose(){let n=this.resolver,r=this.resolvedValue;this.contentEl.empty(),this.deckToggles.clear(),this.deleteButton=void 0,this.selectionCountEl=void 0,this.resolver=void 0,this.resolvedValue=null,this.selectedDeckNames.clear(),n?.(r)}finish(n){this.resolvedValue=n,this.close()}selectAllDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.selectedDeckNames.add(n),this.deckToggles.get(n)?.setValue(!0);this.refreshSelectionState()}clearSelectedDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.deckToggles.get(n)?.setValue(!1);this.refreshSelectionState()}invertSelectedDecks(){let n=new Set;for(let r of this.candidateDeckNames){let i=!this.selectedDeckNames.has(r);this.deckToggles.get(r)?.setValue(i),i&&n.add(r)}this.selectedDeckNames.clear();for(let r of n)this.selectedDeckNames.add(r);this.refreshSelectionState()}refreshSelectionState(){this.deleteButton?.setDisabled(this.selectedDeckNames.size===0),this.selectionCountEl&&(this.selectionCountEl.textContent=this.getSelectionCountText())}getSelectionCountText(){return m("modal.emptyDeck.selectionCount",{selected:this.selectedDeckNames.size,total:this.candidateDeckNames.length})}};var En=require("obsidian");var Et=class{info(t){new En.Notice(t,5e3)}error(t){new En.Notice(t,8e3)}showSyncSummary(t,n){let r=ie(),o=[m(t==="currentFile"?"notice.summary.currentFileSync":"notice.summary.vaultSync",{scannedFiles:n.scannedFiles,scannedCards:n.scannedCards,created:n.created,updated:n.updated,migratedNoteTypes:n.migratedNoteTypes,migratedDecks:n.migratedDecks,orphaned:n.orphaned,uploadedMedia:n.uploadedMedia,skippedUnchangedCards:n.skippedUnchangedCards})];n.markerWriteConflictFiles.length>0&&o.push(m("notice.summary.markerWriteConflicts",{files:ae(r,n.markerWriteConflictFiles)})),n.warnings.length>0&&o.push(m("notice.summary.warningsCount",{count:n.warnings.length})),this.info(o.join(" "));for(let u of n.warnings.slice(0,3))this.info(this.renderDeckWarning(u))}showRebuildSummary(t){let n=ie(),r=[m("notice.summary.rebuild",{scannedFiles:t.scannedFiles,scannedCards:t.scannedCards,migratedDecks:t.migratedDecks,orphaned:t.orphaned,rewrittenMarkers:t.rewrittenMarkers,skippedUnchangedCards:t.skippedUnchangedCards})];t.markerWriteConflictFiles.length>0&&r.push(m("notice.summary.markerWriteConflicts",{files:ae(n,t.markerWriteConflictFiles)})),t.warnings.length>0&&r.push(m("notice.summary.warningsCount",{count:t.warnings.length})),this.info(r.join(" "));for(let i of t.warnings.slice(0,3))this.info(this.renderDeckWarning(i))}showClearCurrentFileSummary(t){let n=ie(),r=[m("notice.summary.clearCurrentFile",{trackedCards:t.trackedCards,trackedGroups:t.trackedGroups,deletedNotes:t.deletedNotes,removedMarkers:t.removedMarkers,removedCardMarkers:t.removedCardMarkers,removedGroupMarkers:t.removedGroupMarkers,deletedLocalRecords:t.deletedLocalRecords})];t.conflictFiles.length>0&&r.push(m("notice.summary.markerRemovalConflicts",{files:ae(n,t.conflictFiles)})),t.failureFiles.length>0&&r.push(m("notice.summary.failures",{items:Zr(t.failureFiles)})),this.info(r.join(" "))}showCleanupEmptyDecksSummary(t){let n=ie(),r=[m("notice.summary.cleanupEmptyDecks",{candidateCount:t.candidateCount,selectedCount:t.selectedCount,deletedCount:t.deletedCount,skippedCount:t.skippedDeckNames.length})];t.skippedDeckNames.length>0&&r.push(m("notice.summary.skippedDecks",{decks:ae(n,t.skippedDeckNames)})),this.info(r.join(" "))}renderDeckWarning(t){return m(yu(t.code),t.params)}};function yu(e){switch(e){case"deck_conflict_yaml_body":return"warnings.deck.conflictYamlBody";case"deck_multiple_body_declarations":return"warnings.deck.multipleBodyDeclarations";case"deck_invalid_folder_segment":return"warnings.deck.invalidFolderSegment";case"deck_fallback_default":return"warnings.deck.fallbackDefault"}}var G=require("obsidian");function wi(e){return e==="cloze"}function vi(e){return e!=="cloze"}var _e=class{map(t,n,r){return this.mapRenderedCard(t,n,r)}mapRenderedCard(t,n,r){let i=this.getRequiredMapping(t,r);return this.validateMapping(i,n),vi(t.type)?this.mapBasic(t,i):this.mapCloze(t,n,i)}suggest(t,n,r,i=Date.now()){if(t==="qa-group")throw new Error("QaGroupFieldMappingService must be used for qa-group mappings.");return xu(t)?{cardType:t,modelName:n,loadedFieldNames:[...r],titleField:_t(r,["Front","Title"])??r[0],bodyField:_t(r,["Back","Body","Answer"])??r.find(a=>a!==(_t(r,["Front","Title"])??r[0])),loadedAt:i}:{cardType:t,modelName:n,loadedFieldNames:[...r],mainField:_t(r,["Text","Body","Content"])??r[0],loadedAt:i}}validateMapping(t,n){if(!Cn(t)&&!Ur(t))throw new Error("QaGroupFieldMappingService validates qa-group mappings.");let r=new Set(n.fieldNames);if(Cn(t)){if(!t.titleField||!t.bodyField)throw new C(Fi(t.cardType),{modelName:t.modelName});if(t.titleField===t.bodyField)throw new C(Cu(t.cardType),{modelName:t.modelName});let i=[t.titleField,t.bodyField].filter(a=>!r.has(a));if(i.length>0)throw new C("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:i.map(a=>`"${a}"`)});return}if(!t.mainField)throw new C("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.modelName});if(!n.isCloze)throw new C("errors.noteFieldMapping.clozeIncompatible",{modelName:t.modelName});if(!r.has(t.mainField))throw new C("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:[`"${t.mainField}"`]})}mapBasic(t,n){let r=n.titleField,i=n.bodyField;if(!r||!i)throw new C(Fi(t.type),{modelName:t.noteModel});return{[r]:t.renderedFields.title,[i]:t.renderedFields.body}}mapCloze(t,n,r){if(!n.isCloze)throw new C("errors.noteFieldMapping.clozeIncompatible",{modelName:t.noteModel});if(!r.mainField)throw new C("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.noteModel});return{[r.mainField]:`${t.renderedFields.title}

${t.renderedFields.body}`}}getRequiredMapping(t,n){let r=n[L(t.type,t.noteModel)];if(!r)throw new C(Su(t.type),{modelName:t.noteModel});return r}};function xu(e){return e==="basic"||e==="semantic-qa"}function Su(e){return e==="cloze"?"errors.noteFieldMapping.missingSavedMapping.cloze":e==="semantic-qa"?"errors.noteFieldMapping.missingSavedMapping.semanticQa":"errors.noteFieldMapping.missingSavedMapping.basic"}function Fi(e){return e==="cloze"?"errors.noteFieldMapping.incompleteSavedMapping.cloze":e==="semantic-qa"?"errors.noteFieldMapping.incompleteSavedMapping.semanticQa":"errors.noteFieldMapping.incompleteSavedMapping.basic"}function Cu(e){return e==="semantic-qa"?"errors.noteFieldMapping.titleBodyMustDiffer.semanticQa":"errors.noteFieldMapping.titleBodyMustDiffer.basic"}function _t(e,t){return e.find(n=>t.some(r=>r.toLowerCase()===n.toLowerCase()))}function Di(e,t){let n=new Set(_n(t));return e.map(r=>_i(r,n,!1))}function Ei(e,t,n,r){let i=Mu(e),a=new Set(_n(t).filter(u=>i.nodeByPath.has(u)));if(!i.nodeByPath.has(n))return It(e,Array.from(a));if(r)return Ti(n,a,i.parentByPath)||(Ai(a,n),a.add(n)),It(e,Array.from(a));let o=Ti(n,a,i.parentByPath);if(o&&(a.delete(o),o!==n)){let u=i.nodeByPath.get(o);if(u)for(let s of Li(u,n))a.add(s)}return Ai(a,n),It(e,Array.from(a))}function It(e,t){let n=new Set(_n(t));return e.flatMap(r=>Ii(r,n).paths)}function _i(e,t,n){let r=n||t.has(e.path),i=e.children.map(o=>_i(o,t,r));if(r)return{...e,checked:!0,indeterminate:!1,children:i};let a=i.some(o=>o.checked||o.indeterminate);return{...e,checked:!1,indeterminate:a,children:i}}function Ii(e,t){return t.has(e.path)?{paths:[e.path]}:e.children.length===0?{paths:[]}:{paths:e.children.map(r=>Ii(r,t)).flatMap(r=>r.paths)}}function Mu(e){let t=new Map,n=new Map,r=(i,a)=>{t.set(i.path,i),n.set(i.path,a);for(let o of i.children)r(o,i.path)};for(let i of e)r(i,void 0);return{nodeByPath:t,parentByPath:n}}function Ti(e,t,n){let r=e;for(;r;){if(t.has(r))return r;r=n.get(r)}}function Ai(e,t){for(let n of Array.from(e))(n===t||Ni(n,t))&&e.delete(n)}function Li(e,t){if(e.path===t)return[];let n=e.children.find(i=>i.path===t||Ni(t,i.path));if(!n)return[e.path];let r=[];for(let i of e.children){if(i.path===n.path){r.push(...Li(i,t));continue}r.push(i.path)}return r}function _n(e){return Array.from(new Set(e.map(t=>wu(t)).filter(Boolean)))}function wu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function Ni(e,t){return e===t||e.startsWith(`${t}/`)}var Pi={key:"settings.scope.loading"},vu=500,Ri=["card-types","sync-content","deck","scope","commands"],In=["basic","qa-group","cloze"],Fu=8,Tu=64,Ie="var(--modal-background, var(--background-primary))",Ln="--ahs-settings-page-header-height",zi="--ahs-settings-sticky-card-gap",Oi=`${Tu}px`,Wi=`${Fu}px`,Au=`var(${Ln}, ${Oi})`,Du=`var(${zi}, ${Wi})`,Bi="12px",Eu="-128px",Gi="-24px",qi="32px",Lt=class extends G.PluginSettingTab{constructor(n){super(n.app,n);this.noteFieldMappingService=new _e;this.qaGroupFieldMappingService=new pe;this.availableNoteModels=[];this.draftMappings={};this.loadedModelDetails={};this.debouncedTextSaves=new Map;this.textDraftValues=new Map;this.cardShells=new Map;this.expandedCardIds=new Set;this.expandedFolderPaths=new Set;this.folderTree=[];this.folderTreeStatus=Pi;this.folderTreeLoadPromise=null;this.hasLoadedFolderTree=!1;this.displayInitialized=!1;this.ankiConfigLoading=!1;this.cardTypeStatusOverride=null;this.noteTypeCacheCheckStatus="idle";this.noteTypeCacheCheckPromise=null;this.detectedAnkiNoteTypeCache=null;this.noteTypeCacheCheckToken=0;this.pageHeaderResizeObserver=null;this.scopeNeedsSelectedAncestorExpansion=!0;this.plugin=n}hide(){this.disconnectPageHeaderResizeObserver(),super.hide(),this.displayInitialized=!1,this.cardShells.clear(),this.clearDebouncedTextSaves(),this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus="idle",this.noteTypeCacheCheckPromise=null,this.detectedAnkiNoteTypeCache=null,this.noteTypeCacheCheckToken+=1,this.scopeNeedsSelectedAncestorExpansion=!0}display(){let{containerEl:n}=this,r=n.scrollTop;if(!this.displayInitialized){n.style.setProperty(Ln,Oi),n.style.setProperty(zi,Wi),n.empty();let i=n.createDiv();i.dataset.settingsPageHeader="true",i.style.position="sticky",i.style.top="0px",i.style.zIndex="300",i.style.width="100%",i.style.boxSizing="border-box",i.style.paddingTop=Bi,i.style.paddingBottom=`calc(${Bi} + ${Du})`,i.style.marginBottom="0",i.style.overflow="visible",i.style.background=Ie,i.style.backgroundColor=Ie,i.style.boxShadow="none";let a=i.createDiv();a.dataset.settingsPageHeaderMask="true",a.style.position="absolute",a.style.top=Eu,a.style.left=Gi,a.style.right=Gi,a.style.bottom="0px",a.style.zIndex="0",a.style.pointerEvents="none",a.style.background=Ie,a.style.backgroundColor=Ie;let o=i.createEl("h2",{text:m("settings.pluginTitle")});o.style.margin="0",o.style.position="relative",o.style.zIndex="1",this.observePageHeaderHeight(i);let u=n.createDiv();u.dataset.settingsCardsContainer="true",this.initializeCards(u),this.displayInitialized=!0}for(let i of Ri)this.renderCard(i);n.scrollTop=r}initializeCards(n){this.cardShells.clear();for(let r of Ri){let i=n.createDiv();i.dataset.settingsCard=r;let a=i.createEl("button");a.type="button",a.dataset.settingsCardToggle=r,a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="flex-start",a.style.position="sticky",a.style.top=Au,a.style.zIndex="200",a.style.width="100%",a.style.maxWidth="100%",a.style.boxSizing="border-box",a.style.padding="10px 14px",a.style.fontSize="1.5em",a.style.fontWeight="600",a.style.background=Ie,a.style.backgroundColor=Ie,a.style.border="2px solid var(--background-modifier-border)",a.style.borderRadius="0",a.style.marginBottom="8px",a.style.textAlign="left",a.style.boxShadow="none",a.addEventListener("click",()=>{this.toggleCard(r)});let o=i.createDiv();o.dataset.settingsCardBody=r,this.cardShells.set(r,{cardEl:i,headerEl:a,bodyEl:o})}}toggleCard(n){this.expandedCardIds.has(n)?this.expandedCardIds.delete(n):this.expandedCardIds.add(n),this.renderCard(n)}renderCard(n){let r=this.cardShells.get(n);if(!r)return;let i=this.expandedCardIds.has(n);if(r.headerEl.textContent=`${i?"\u25BE":"\u25B8"} ${this.getCardTitle(n)}`,r.headerEl.setAttr("aria-expanded",String(i)),r.bodyEl.style.display=i?"block":"none",r.bodyEl.empty(),!!i){if(n==="card-types"){this.renderCardTypesCard(r.bodyEl);return}if(n==="sync-content"){this.renderSyncContentCard(r.bodyEl);return}if(n==="scope"){this.renderScopeCard(r.bodyEl);return}if(n==="deck"){this.renderDeckCard(r.bodyEl);return}this.renderCommandsCard(r.bodyEl)}}observePageHeaderHeight(n){this.disconnectPageHeaderResizeObserver(),this.updatePageHeaderHeight(n),!(typeof ResizeObserver>"u")&&(this.pageHeaderResizeObserver=new ResizeObserver(()=>{this.updatePageHeaderHeight(n)}),this.pageHeaderResizeObserver.observe(n))}updatePageHeaderHeight(n){let r=n.getBoundingClientRect().height;!Number.isFinite(r)||r<=0||this.containerEl.style.setProperty(Ln,`${Math.round(r)}px`)}disconnectPageHeaderResizeObserver(){this.pageHeaderResizeObserver?.disconnect(),this.pageHeaderResizeObserver=null}renderCardTypesCard(n){this.hydrateVisibleCardTypeCaches(),this.maybeStartNoteTypeCacheCheck();let r=n.createDiv();r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="flex-start",r.style.gap="8px";let i=r.createEl("button",{text:this.ankiConfigLoading?m("settings.cards.cardTypes.loadAnki.loading"):m("settings.cards.cardTypes.loadAnki.button")});i.type="button",i.dataset.cardTypesRefresh="true",i.disabled=this.ankiConfigLoading,i.addEventListener("click",()=>this.loadAnkiCardTypeConfig()),r.createEl("span",{text:`${m("settings.cards.cardTypes.statusLabel")}${Te(this.getCardTypeStatusMessage())}`});let a=n.createDiv();a.dataset.cardTypeList="true",a.style.display="flex",a.style.flexDirection="column",a.style.gap="14px";for(let o of In)this.renderCardTypeBlock(a,o)}renderCardTypeBlock(n,r){let i=this.plugin.settings.cardTypeConfigs[r],a=n.createDiv();a.dataset.cardTypeConfig=r,a.style.display="flex",a.style.flexDirection="column",a.style.gap="8px",a.style.padding="12px",a.style.border="1px solid var(--background-modifier-border)",a.style.borderRadius="8px";let o=a.createDiv();o.style.display="flex",o.style.alignItems="center",o.style.gap="10px";let u=o.createEl("input");u.type="checkbox",u.checked=i.enabled,u.dataset.cardTypeEnabled=r,u.addEventListener("change",()=>this.saveCardTypeConfig(r,{enabled:u.checked}));let s=o.createEl("strong",{text:this.getCardTypeLabel(r)});s.style.fontSize="var(--font-ui-medium)";let c=a.createDiv();c.style.display="flex",c.style.flexWrap="wrap",c.style.alignItems="center",c.style.gap="10px 14px";let d=this.createInlineControlGroup(c,m("settings.cards.cardTypes.labels.headingLevel")),l=this.createSelect(d,`card-type-heading:${r}`);l.dataset.cardTypeHeading=r,l.style.width="88px";for(let k=1;k<=6;k+=1)this.appendOption(l,String(k),`H${k}`);l.value=String(i.headingLevel),l.addEventListener("change",()=>this.saveCardTypeConfig(r,{headingLevel:Number(l.value)}));let g=this.createInlineControlGroup(c,m("settings.cards.cardTypes.labels.extraMarker")).createEl("input");g.type="text",g.dataset.cardTypeMarker=r,g.placeholder=m("settings.cards.cardTypes.markerPlaceholder"),g.style.width="220px",g.value=this.getDraftValue(`card-type-marker:${r}`,i.extraMarker),g.addEventListener("input",()=>{this.scheduleDebouncedTextSave(`card-type-marker:${r}`,g.value,async k=>{await this.saveCardTypeConfig(r,{extraMarker:k})&&this.textDraftValues.delete(`card-type-marker:${r}`)})});let p=a.createDiv();p.style.display="grid",p.style.gridTemplateColumns="minmax(0, 1.1fr) minmax(0, 0.75fr) minmax(220px, 0.95fr)",p.style.alignItems="center",p.style.columnGap="16px",p.style.rowGap="8px",p.style.overflow="visible",p.style.width="100%";let M=this.createGridControlSlot(p,m("settings.cards.cardTypes.labels.noteType")),b=this.createSelect(M,`card-type-note-type:${r}`);b.dataset.cardTypeNoteType=r,this.applyFluidEllipsis(b);for(let k of this.getSelectableNoteModels(i.noteType))this.appendOption(b,k,k);b.value=i.noteType,b.disabled=this.ankiConfigLoading,b.addEventListener("change",()=>this.saveCardTypeConfig(r,{noteType:b.value})),this.renderCardTypeFieldControls(p,r)}renderCardTypeFieldControls(n,r){if(r==="qa-group"){this.renderQaGroupFieldControls(n,r);return}let i=this.getCurrentMappingForConfig(r);if(r==="cloze"){let d=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.mainField")),l=this.createFieldSelect(d,`card-type-question-field:${r}`),f=i&&"mainField"in i?i:void 0;l.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(l),this.populateFieldSelect(l,f?.loadedFieldNames??[],f?.mainField),l.addEventListener("change",()=>this.saveFieldMapping(r,{mainField:l.value||void 0}));return}let a=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.questionField")),o=this.createFieldSelect(a,`card-type-question-field:${r}`),u=i&&"bodyField"in i?i:void 0;o.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(o),this.populateFieldSelect(o,u?.loadedFieldNames??[],u?.titleField),o.addEventListener("change",()=>this.saveFieldMapping(r,{titleField:o.value||void 0}));let s=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.answerField")),c=this.createFieldSelect(s,`card-type-answer-field:${r}`);c.dataset.cardTypeAnswerField=r,this.applyFluidEllipsis(c),this.populateFieldSelect(c,u?.loadedFieldNames??[],u?.bodyField),c.addEventListener("change",()=>this.saveFieldMapping(r,{bodyField:c.value||void 0}))}renderQaGroupFieldControls(n,r){let i=this.plugin.settings.cardTypeConfigs[r].noteType.trim(),a=this.getQaGroupFieldState(r),o=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.qaGroupTitleField"));if(a.mapping){let f=this.createFieldSelect(o,`card-type-qa-group-title-field:${r}`);f.dataset.qaGroupTitleField=r,this.applyFluidEllipsis(f),this.populateFieldSelect(f,a.mapping.loadedFieldNames,a.mapping.titleField),f.addEventListener("change",()=>this.saveFieldMapping(r,{titleField:f.value||void 0}))}else o.createEl("span",{text:i.length>0?m("settings.cards.cardTypes.qaGroup.unavailable"):m("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupTitleField=r;let s=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.qaGroupSlotFields")).createEl("span",{text:a.mapping?m("settings.cards.cardTypes.qaGroup.detectedSlots",{count:a.mapping.slots.length}):i.length>0?m("settings.cards.cardTypes.qaGroup.unavailable"):m("settings.cards.cardTypes.qaGroup.noModel")});if(s.dataset.qaGroupSlotSummary=r,this.applyFluidEllipsis(s),a.error){let f=n.createDiv({text:Te(a.error)});f.dataset.qaGroupError=r,f.style.gridColumn="1 / -1";return}if(!a.mapping||a.mapping.warnings.length===0)return;let c=n.createDiv();c.dataset.qaGroupWarnings=r,c.style.gridColumn="1 / -1",c.style.display="flex",c.style.flexDirection="column",c.style.gap="6px",c.createEl("strong",{text:m("settings.cards.cardTypes.labels.qaGroupWarnings")});for(let f of a.mapping.warnings)c.createEl("div",{text:this.renderQaGroupWarning(f)}).dataset.qaGroupWarning=r;let d=c.createEl("label");d.style.display="inline-flex",d.style.alignItems="center",d.style.gap="8px";let l=d.createEl("input");l.type="checkbox",l.checked=ut(a.mapping.warnings,a.mapping.acceptedWarnings),l.dataset.qaGroupWarningAccept=r,l.addEventListener("change",()=>this.saveQaGroupWarningAcceptance(r,l.checked)),d.createEl("span",{text:m("settings.cards.cardTypes.qaGroup.acceptWarnings")})}renderSyncContentCard(n){let r=this.createSyncContentSection(n,"body-range",m("settings.cards.syncContent.sections.bodyRange"));new G.Setting(r).setName(m("settings.cardAnswerCutoffMode.name")).setDesc(m("settings.cardAnswerCutoffMode.desc")).addDropdown(u=>{u.addOption("heading-block",m("settings.cardAnswerCutoffMode.options.headingBlock")),u.addOption("double-blank-lines",m("settings.cardAnswerCutoffMode.options.doubleBlankLines")),u.setValue(this.plugin.settings.cardAnswerCutoffMode).onChange(s=>{this.plugin.updateSettings({cardAnswerCutoffMode:s})})});let i=this.createSyncContentSection(n,"backlink",m("settings.cards.syncContent.sections.backlink"));new G.Setting(i).setName(m("settings.syncOptions.addObsidianBacklink.name")).setDesc(m("settings.syncOptions.addObsidianBacklink.desc")).addToggle(u=>{u.setValue(this.plugin.settings.addObsidianBacklink).onChange(s=>{this.plugin.updateSettings({addObsidianBacklink:s})})}),new G.Setting(i).setName(m("settings.syncOptions.obsidianBacklinkLabel.name")).setDesc(m("settings.syncOptions.obsidianBacklinkLabel.desc")).addText(u=>{u.setPlaceholder(m("settings.syncOptions.obsidianBacklinkLabel.placeholder")).setValue(this.getDraftValue("obsidian-backlink-label",this.plugin.settings.obsidianBacklinkLabel)).onChange(s=>{this.scheduleDebouncedTextSave("obsidian-backlink-label",s,async c=>{let d=c.trim();await this.plugin.updateSettings({obsidianBacklinkLabel:d||Qe}),this.textDraftValues.delete("obsidian-backlink-label")})})}),new G.Setting(i).setName(m("settings.syncOptions.obsidianBacklinkPlacement.name")).setDesc(m("settings.syncOptions.obsidianBacklinkPlacement.desc")).addDropdown(u=>{u.addOption("question-last-line",m("settings.syncOptions.obsidianBacklinkPlacement.options.questionLastLine")),u.addOption("answer-first-line",m("settings.syncOptions.obsidianBacklinkPlacement.options.answerFirstLine")),u.addOption("answer-last-line",m("settings.syncOptions.obsidianBacklinkPlacement.options.answerLastLine")),u.setValue(this.plugin.settings.obsidianBacklinkPlacement).onChange(s=>{this.plugin.updateSettings({obsidianBacklinkPlacement:s})})});let a=this.createSyncContentSection(n,"tags",m("settings.cards.syncContent.sections.tags"));new G.Setting(a).setName(m("settings.syncOptions.syncObsidianTagsToAnki.name")).setDesc(m("settings.syncOptions.syncObsidianTagsToAnki.desc")).addToggle(u=>{u.setValue(this.plugin.settings.syncObsidianTagsToAnki).onChange(s=>{this.plugin.updateSettings({syncObsidianTagsToAnki:s})})}),new G.Setting(a).setName(m("settings.syncOptions.keepPureTagLinesInCardBody.name")).setDesc(m("settings.syncOptions.keepPureTagLinesInCardBody.desc")).addToggle(u=>{u.setValue(this.plugin.settings.keepPureTagLinesInCardBody).onChange(s=>{this.plugin.updateSettings({keepPureTagLinesInCardBody:s})})});let o=this.createSyncContentSection(n,"cloze-special",m("settings.cards.syncContent.sections.clozeSpecial"));new G.Setting(o).setName(m("settings.syncOptions.highlightsToCloze.name")).setDesc(m("settings.syncOptions.highlightsToCloze.desc")).addToggle(u=>{u.setValue(this.plugin.settings.convertHighlightsToCloze).onChange(s=>{this.plugin.updateSettings({convertHighlightsToCloze:s})})})}createSyncContentSection(n,r,i){let a=n.createDiv();a.dataset.syncContentSection=r,a.style.display="flex",a.style.flexDirection="column",a.style.gap="8px",a.style.marginTop="16px";let o=a.createEl("h4",{text:i});return o.dataset.syncContentSectionTitle=r,o.style.margin="0",a}renderScopeCard(n){if(new G.Setting(n).setName(m("settings.scope.name")).setDesc(_u(this.plugin.settings.scopeMode)).addDropdown(s=>{s.addOption("all",m("settings.scope.option.all")).addOption("include",m("settings.scope.option.include")).addOption("exclude",m("settings.scope.option.exclude")).setValue(this.plugin.settings.scopeMode).onChange(c=>{c!=="all"&&c!=="include"&&c!=="exclude"||this.updateScopeMode(c)})}),this.plugin.settings.scopeMode==="all")return;let i=n.createDiv().createEl("button",{text:m("settings.cards.scope.refreshFolders")});if(i.type="button",i.dataset.scopeRefreshFolders="true",i.disabled=!!this.folderTreeLoadPromise,i.addEventListener("click",()=>{this.refreshFolderTree()}),this.ensureFolderTreeLoaded(),n.createEl("p",{text:Nu(this.plugin.settings.scopeMode)}),this.folderTreeLoadPromise||this.folderTree.length===0){n.createEl("p",{text:Te(this.folderTreeStatus)});return}this.expandSelectedFolderAncestorsIfNeeded(this.plugin.settings.scopeMode);let a=this.getSelectedFoldersForScopeMode(this.plugin.settings.scopeMode),o=Di(this.folderTree,a),u=n.createDiv();u.dataset.scopeTree="true",u.style.display="flex",u.style.flexDirection="column",u.style.gap="2px";for(let s of o)this.renderFolderNode(u,s,this.plugin.settings.scopeMode,0)}renderDeckCard(n){let r=this.createDeckSection(n,"folder-mapping",m("settings.cards.deck.sections.folderMapping"));new G.Setting(r).setName(m("settings.deck.folderDeckMode.name")).setDesc(m("settings.deck.folderDeckMode.desc")).addDropdown(o=>{this.populateFolderDeckModeDropdown(o,this.plugin.settings.folderDeckMode),o.onChange(u=>{u!=="off"&&u!=="folder"&&u!=="folder-and-file"||this.plugin.updateSettings({folderDeckMode:u})})}),this.renderDeckExampleBlock(r);let i=this.createDeckSection(n,"file-deck",m("settings.cards.deck.sections.fileDeck"));new G.Setting(i).setName(m("settings.deck.fileDeckEnabled.name")).setDesc(m("settings.deck.fileDeckEnabled.desc")).addToggle(o=>{o.setValue(this.plugin.settings.fileDeckEnabled).onChange(async u=>{await this.plugin.updateSettings({fileDeckEnabled:u}),this.renderCard("deck")})}),this.plugin.settings.fileDeckEnabled&&(new G.Setting(i).setName(m("settings.deck.marker.name")).setDesc(m("settings.deck.marker.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-marker",this.plugin.settings.fileDeckMarker)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-marker",u,async s=>{let c=s.trim();if(!c){this.textDraftValues.delete("file-deck-marker"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckMarker:c}),this.textDraftValues.delete("file-deck-marker")})})}),new G.Setting(i).setName(m("settings.deck.template.name")).setDesc(m("settings.deck.template.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-template",this.plugin.settings.fileDeckTemplate)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-template",u,async s=>{let c=s.trim();if(!c){this.textDraftValues.delete("file-deck-template"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckTemplate:c}),this.textDraftValues.delete("file-deck-template")})})}),new G.Setting(i).setName(m("settings.deck.insertLocation.name")).setDesc(m("settings.deck.insertLocation.desc")).addDropdown(o=>{this.populateFileDeckInsertLocationDropdown(o,this.plugin.settings.fileDeckInsertLocation),o.onChange(u=>{u!=="yaml"&&u!=="body"||this.plugin.updateSettings({fileDeckInsertLocation:u})})}),new G.Setting(i).setName(m("settings.deck.insertTemplate.name")).setDesc(m("settings.deck.insertTemplate.desc")).addButton(o=>{o.setButtonText(m("settings.deck.insertTemplate.button")).onClick(()=>{this.plugin.insertDeckTemplateToCurrentFile()})}));let a=this.createDeckSection(n,"default-deck",m("settings.cards.deck.sections.defaultDeck"));new G.Setting(a).setName(m("settings.deck.defaultDeck.name")).setDesc(m("settings.deck.defaultDeck.desc")).addText(o=>{o.setValue(this.getDraftValue("default-deck",this.plugin.settings.defaultDeck)).onChange(u=>{this.scheduleDebouncedTextSave("default-deck",u,async s=>{let c=s.trim();if(!c){this.textDraftValues.delete("default-deck"),this.renderCard("deck");return}await this.plugin.updateSettings({defaultDeck:c}),this.textDraftValues.delete("default-deck")})})}),this.createDeckHelperText(a,m("settings.deck.fallbackDesc"),"fallback"),this.createDeckPriorityFooter(n)}renderDeckExampleBlock(n){let r=n.createDiv();r.dataset.deckExampleBlock="true",r.style.display="flex",r.style.flexDirection="column",r.style.gap="4px",r.style.marginTop="2px",r.style.marginLeft=qi;let i=r.createEl("strong",{text:m("settings.deck.examplesTitle")});i.style.fontSize="var(--font-ui-small)";for(let a of[m("settings.deck.folderExample"),m("settings.deck.folderAndFileExample")]){let o=r.createDiv({text:a});o.dataset.deckExampleRow="true",o.style.color="var(--text-muted)",o.style.fontSize="var(--font-ui-small)",o.style.lineHeight="1.4"}}createDeckHelperText(n,r,i){let a=n.createDiv({text:r});return a.dataset.deckHelperText=i,a.style.color="var(--text-muted)",a.style.fontSize="var(--font-ui-small)",a.style.lineHeight="1.4",a.style.marginTop="2px",a.style.marginLeft=qi,a}createDeckPriorityFooter(n){let r=this.createDeckHelperText(n,m("settings.deck.priorityDesc"),"priority");r.dataset.deckPriorityFooter="true",r.style.marginTop="12px"}createDeckSection(n,r,i){let a=n.createDiv();a.dataset.deckSection=r,a.style.display="flex",a.style.flexDirection="column",a.style.gap="8px",a.style.marginTop="16px";let o=a.createEl("h4",{text:i});return o.dataset.deckSectionTitle=r,o.style.margin="0",a}renderCommandsCard(n){n.createEl("p",{text:m("settings.cards.commands.desc")});let r=n.createEl("ul");for(let[i,a]of[[m("commands.syncCurrentFileToAnki"),m("settings.cards.commands.items.syncCurrentFile")],[m("commands.syncVaultToAnki"),m("settings.cards.commands.items.syncVault")],[m("commands.rebuildCardIndex"),m("settings.cards.commands.items.rebuildIndex")],[m("commands.clearCurrentFileSyncedCards"),m("settings.cards.commands.items.clearCurrentFile")],[m("commands.cleanupEmptyDecks"),m("settings.cards.commands.items.cleanupDecks")]])r.createEl("li",{text:`${i}: ${a}`})}async saveCardTypeConfig(n,r){let i={...this.plugin.settings.cardTypeConfigs,[n]:{...this.plugin.settings.cardTypeConfigs[n],...r}};try{oe(ke({...this.plugin.settings,cardTypeConfigs:i}))}catch(a){return this.cardTypeStatusOverride=Ae(a,"settings.cards.cardTypes.failedSave"),this.renderCard("card-types"),!1}if(this.cardTypeStatusOverride=null,await this.plugin.updateSettings({cardTypeConfigs:i}),n==="qa-group"&&typeof r.noteType=="string"){await this.syncQaGroupMappingFromCache(i[n].noteType);let a=L("qa-group",i[n].noteType);if(!this.plugin.settings.noteFieldMappings[a]){let o=this.plugin.settings.ankiModelFieldCache[i[n].noteType];if(o){let u=this.qaGroupFieldMappingService.suggest(i[n].noteType,o.fieldNames,o.loadedAt);await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[a]:u}})}}}return this.renderCard("card-types"),!0}async saveFieldMapping(n,r){let i=this.getCurrentMappingForConfig(n),a=this.getRuntimeCardType(n),o=this.plugin.settings.cardTypeConfigs[n].noteType,u=L(a,o),s={...i??this.createFallbackMapping(a,o),...r};this.cardTypeStatusOverride=null,this.draftMappings[u]=s,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[u]:{...s,loadedFieldNames:[...s.loadedFieldNames]}}}),this.renderCard("card-types")}async loadAnkiCardTypeConfig(){this.noteTypeCacheCheckToken+=1,this.noteTypeCacheCheckPromise=null,this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus=this.resolveManualRefreshCacheStatus(),this.ankiConfigLoading=!0,this.renderCard("card-types");try{let n=await this.plugin.listNoteModels(),r=Hi(n);this.availableNoteModels.splice(0,this.availableNoteModels.length,...r);let i=await this.plugin.getModelFieldNamesByModelNames(r),a=Date.now(),o=Object.entries(i).reduce((s,[c,d])=>(s[c]={fieldNames:[...d],loadedAt:a},s),{});await this.plugin.updateSettings({ankiNoteTypeCache:this.getAvailableNoteModels(),ankiModelFieldCache:o}),this.hydrateVisibleCardTypeCaches(o),await this.syncQaGroupMappingFromCache(this.plugin.settings.cardTypeConfigs["qa-group"].noteType,o);let u=this.countConfiguredCardTypes(o);this.detectedAnkiNoteTypeCache=[...r],this.noteTypeCacheCheckStatus="same",this.cardTypeStatusOverride={key:"settings.cards.cardTypes.loadedSummary",params:{noteTypeCount:this.availableNoteModels.length,configuredCount:u}}}catch(n){this.cardTypeStatusOverride=Ae(n,"settings.cards.cardTypes.failedLoad")}finally{this.ankiConfigLoading=!1,this.renderCard("card-types")}}maybeStartNoteTypeCacheCheck(){if(this.ankiConfigLoading||this.plugin.settings.ankiNoteTypeCache.length===0||this.noteTypeCacheCheckStatus!=="idle"||this.noteTypeCacheCheckPromise)return;this.noteTypeCacheCheckStatus="checking";let n=++this.noteTypeCacheCheckToken,r=this.checkNoteTypeCacheFreshness(n).finally(()=>{this.noteTypeCacheCheckPromise===r&&(this.noteTypeCacheCheckPromise=null),n===this.noteTypeCacheCheckToken&&this.renderCard("card-types")});this.noteTypeCacheCheckPromise=r}async checkNoteTypeCacheFreshness(n){try{let r=Hi(await this.plugin.listNoteModels());if(n!==this.noteTypeCacheCheckToken)return;this.detectedAnkiNoteTypeCache=r,this.noteTypeCacheCheckStatus=Lu(this.plugin.settings.ankiNoteTypeCache,r)?"same":"changed"}catch{if(n!==this.noteTypeCacheCheckToken)return;this.noteTypeCacheCheckStatus="failed"}}getCardTypeStatusMessage(){if(this.ankiConfigLoading)return{key:"settings.cards.cardTypes.loadAnki.loading"};if(this.cardTypeStatusOverride)return this.cardTypeStatusOverride;let n=this.plugin.settings.ankiNoteTypeCache.length;if(n===0)return{key:"settings.cards.cardTypes.cacheEmpty"};let r=this.countConfiguredCardTypes(this.plugin.settings.ankiModelFieldCache);return this.noteTypeCacheCheckStatus==="changed"?{key:"settings.cards.cardTypes.cacheChanged",params:{cachedCount:n,liveCount:this.detectedAnkiNoteTypeCache?.length??n,configuredCount:r}}:this.noteTypeCacheCheckStatus==="failed"?{key:"settings.cards.cardTypes.cacheCheckFailed",params:{noteTypeCount:n,configuredCount:r}}:{key:"settings.cards.cardTypes.cacheSummary",params:{noteTypeCount:n,configuredCount:r}}}resolveManualRefreshCacheStatus(){return this.noteTypeCacheCheckStatus==="changed"||this.noteTypeCacheCheckStatus==="failed"?this.noteTypeCacheCheckStatus:this.plugin.settings.ankiNoteTypeCache.length>0?"same":"idle"}hydrateVisibleCardTypeCaches(n=this.plugin.settings.ankiModelFieldCache){for(let r of In)this.hydrateCardTypeCache(r,n)}hydrateCardTypeCache(n,r){let i=this.getRuntimeCardType(n),a=this.plugin.settings.cardTypeConfigs[n].noteType,o=L(i,a),u=r[a];if(!u)return;let s=this.createCachedModelDetails(a,u.fieldNames);this.loadedModelDetails[o]=s,this.seedDraftMapping(i,a,s,u.loadedAt)}createCachedModelDetails(n,r){return{fieldNames:[...r],isCloze:n.toLowerCase().includes("cloze")}}countConfiguredCardTypes(n){return In.reduce((r,i)=>{let a=this.plugin.settings.cardTypeConfigs[i];return a.enabled?r+(n[a.noteType]?1:0):r},0)}seedDraftMapping(n,r,i,a=Date.now()){let o=L(n,r),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];if(n==="qa-group"){try{this.draftMappings[o]=this.qaGroupFieldMappingService.suggest(r,i.fieldNames,a,B(u)?u.acceptedWarnings:void 0,B(u)?u.titleField:void 0)}catch{delete this.draftMappings[o]}return}if(u){this.draftMappings[o]={...u,loadedFieldNames:[...i.fieldNames],loadedAt:a};return}this.draftMappings[o]=this.noteFieldMappingService.suggest(n,r,i.fieldNames,a)}getSelectableNoteModels(n){let r=this.availableNoteModels.length>0?this.getAvailableNoteModels():[...this.plugin.settings.ankiNoteTypeCache];return r.includes(n)||r.unshift(n),r}getAvailableNoteModels(){return[...this.availableNoteModels]}getCurrentMappingForConfig(n){let r=this.getRuntimeCardType(n),i=this.plugin.settings.cardTypeConfigs[n].noteType,a=L(r,i),o=this.draftMappings[a]??this.plugin.settings.noteFieldMappings[a];if(o)return{...o,loadedFieldNames:[...o.loadedFieldNames]};let u=this.loadedModelDetails[a];if(!u)return;if(r==="qa-group")try{let c=this.plugin.settings.noteFieldMappings[a]??this.draftMappings[a],d=this.qaGroupFieldMappingService.suggest(i,u.fieldNames,Date.now(),B(c)?c.acceptedWarnings:void 0,B(c)?c.titleField:void 0);return this.draftMappings[a]=d,{...d,loadedFieldNames:[...d.loadedFieldNames],slots:d.slots.map(l=>({...l})),warnings:[...d.warnings],acceptedWarnings:d.acceptedWarnings?[...d.acceptedWarnings]:void 0}}catch{return}let s=this.noteFieldMappingService.suggest(r,i,u.fieldNames);return this.draftMappings[a]=s,{...s,loadedFieldNames:[...s.loadedFieldNames]}}createFallbackMapping(n,r){let i=L(n,r),a=this.loadedModelDetails[i];if(a){if(n==="qa-group"){let o=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return this.qaGroupFieldMappingService.suggest(r,a.fieldNames,Date.now(),B(o)?o.acceptedWarnings:void 0,B(o)?o.titleField:void 0)}return this.noteFieldMappingService.suggest(n,r,a.fieldNames)}return n==="qa-group"?{cardType:n,modelName:r,titleField:void 0,slots:[],warnings:[],acceptedWarnings:void 0,loadedFieldNames:[],loadedAt:Date.now()}:{cardType:n,modelName:r,loadedFieldNames:[],loadedAt:Date.now()}}async saveQaGroupWarningAcceptance(n,r){let i=this.getCurrentMappingForConfig(n);if(!i||!B(i))return;let a=this.getRuntimeCardType(n),o=L(a,i.modelName),u={...i,slots:i.slots.map(s=>({...s})),warnings:[...i.warnings],acceptedWarnings:r?[...i.warnings]:void 0,loadedFieldNames:[...i.loadedFieldNames]};this.cardTypeStatusOverride=null,this.draftMappings[o]=u,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:u}}),this.renderCard("card-types")}async syncQaGroupMappingFromCache(n,r=this.plugin.settings.ankiModelFieldCache){let i=n.trim();if(i.length===0)return;let a=r[i];if(!a)return;let o=L("qa-group",i),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];try{let s=this.qaGroupFieldMappingService.suggest(i,a.fieldNames,a.loadedAt,B(u)?u.acceptedWarnings:void 0,B(u)?u.titleField:void 0);this.draftMappings[o]=s,Iu(this.plugin.settings.noteFieldMappings[o],s)||await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:s}})}catch{if(delete this.draftMappings[o],this.plugin.settings.noteFieldMappings[o]){let s={...this.plugin.settings.noteFieldMappings};delete s[o],await this.plugin.updateSettings({noteFieldMappings:s})}}}getQaGroupFieldState(n){let r=this.plugin.settings.cardTypeConfigs[n].noteType,i=L("qa-group",r),a=this.draftMappings[i]??this.plugin.settings.noteFieldMappings[i];if(a&&B(a))return{mapping:{...a,loadedFieldNames:[...a.loadedFieldNames],slots:a.slots.map(u=>({...u})),warnings:[...a.warnings],acceptedWarnings:a.acceptedWarnings?[...a.acceptedWarnings]:void 0}};let o=this.loadedModelDetails[i];if(!o)return{};try{let u=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return{mapping:this.qaGroupFieldMappingService.suggest(r,o.fieldNames,Date.now(),B(u)?u.acceptedWarnings:void 0,B(u)?u.titleField:void 0)}}catch(u){return{error:Ae(u,"settings.cards.cardTypes.failedSave")}}}renderQaGroupWarning(n){let r=Jr(n);if(!r)return n;let i=String(r.index).padStart(2,"0");return r.kind==="missing-answer"?m("settings.cards.cardTypes.qaGroup.warning.missingAnswer",{index:i,questionField:r.questionField,answerField:r.answerField}):m("settings.cards.cardTypes.qaGroup.warning.missingQuestion",{index:i,questionField:r.questionField,answerField:r.answerField})}getRuntimeCardType(n){return n==="qa-group"?"qa-group":n==="cloze"?"cloze":n==="semantic-qa"?"semantic-qa":"basic"}ensureFolderTreeLoaded(n=!1){n&&(this.hasLoadedFolderTree=!1,this.folderTree=[]),!(this.hasLoadedFolderTree||this.folderTreeLoadPromise)&&(this.folderTreeStatus=Pi,this.folderTreeLoadPromise=this.plugin.listFolderTree().then(r=>{this.folderTree=r,this.folderTreeStatus=r.length>0?{rawMessage:""}:{key:"settings.scope.empty"},this.requestSelectedFolderAncestorExpansion()}).catch(r=>{this.folderTree=[],this.folderTreeStatus=Ae(r,"settings.scope.failedLoad")}).finally(()=>{this.hasLoadedFolderTree=!0,this.folderTreeLoadPromise=null,this.renderCard("scope")}))}async refreshFolderTree(){this.expandedFolderPaths.clear(),this.ensureFolderTreeLoaded(!0),this.renderCard("scope")}async updateScopeMode(n){await this.plugin.updateSettings({scopeMode:n}),n!=="all"&&(this.requestSelectedFolderAncestorExpansion(),this.ensureFolderTreeLoaded()),this.renderCard("scope")}async updateFolderSelection(n,r,i){let a=n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders,o=Ei(this.folderTree,a,r,i);await this.plugin.updateSettings(n==="include"?{includeFolders:o}:{excludeFolders:o}),this.renderCard("scope")}renderFolderNode(n,r,i,a){let o=n.createDiv();o.dataset.folderRow=r.path,o.style.display="grid",o.style.gridTemplateColumns="24px 24px minmax(0, 1fr)",o.style.alignItems="center",o.style.columnGap="0px",o.style.minHeight="28px",o.style.marginLeft=`${a*18}px`,o.style.width="100%",o.style.boxSizing="border-box";let u=r.children.length>0,s=u&&this.expandedFolderPaths.has(r.path),c=o.createEl(u?"button":"span");c.dataset.folderToggle=r.path,c.textContent=u?s?"\u25BE":"\u25B8":"",c.style.width="24px",c.style.height="24px",c.style.display="inline-flex",c.style.alignItems="center",c.style.justifyContent="center",c.style.padding="0",c.style.margin="0",c.style.border="0",c.style.background="transparent",c.style.boxShadow="none",c.style.fontSize="2em",c.style.lineHeight="1",c.style.color="var(--text-muted)",u&&(c.setAttr("aria-label",s?m("settings.scope.collapseFolder",{name:r.name}):m("settings.scope.expandFolder",{name:r.name})),c.setAttr("title",s?m("settings.scope.collapseFolder",{name:r.name}):m("settings.scope.expandFolder",{name:r.name})),c.style.cursor="pointer",c.addEventListener("click",()=>{this.expandedFolderPaths.has(r.path)?this.expandedFolderPaths.delete(r.path):this.expandedFolderPaths.add(r.path),this.renderCard("scope")}));let d=o.createEl("input");d.type="checkbox",d.checked=r.checked,d.indeterminate=r.indeterminate,d.dataset.folderPath=r.path,d.style.margin="0",d.style.justifySelf="center",d.addEventListener("change",()=>{this.updateFolderSelection(i,r.path,d.checked)});let l=o.createEl("span",{text:r.name});if(l.dataset.folderPathLabel=r.path,l.style.minWidth="0",l.style.overflow="hidden",l.style.textOverflow="ellipsis",l.style.whiteSpace="nowrap",!u||!s)return;let f=n.createDiv();f.dataset.folderChildren=r.path,f.style.display="flex",f.style.flexDirection="column",f.style.gap="2px";for(let g of r.children)this.renderFolderNode(f,g,i,a+1)}requestSelectedFolderAncestorExpansion(){this.scopeNeedsSelectedAncestorExpansion=!0}expandSelectedFolderAncestorsIfNeeded(n){if(this.scopeNeedsSelectedAncestorExpansion){this.scopeNeedsSelectedAncestorExpansion=!1;for(let r of this.getSelectedFoldersForScopeMode(n))for(let i of Pu(r))this.expandedFolderPaths.add(i)}}getSelectedFoldersForScopeMode(n){return n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders}createInlineControlGroup(n,r){let i=n.createEl("label");i.style.display="inline-flex",i.style.alignItems="center",i.style.gap="6px",i.style.flexWrap="nowrap";let a=i.createEl("span",{text:r});return a.style.whiteSpace="nowrap",i}createGridControlSlot(n,r){let i=n.createEl("label");i.style.display="flex",i.style.alignItems="center",i.style.gap="8px",i.style.minWidth="0",i.style.overflow="visible";let a=i.createEl("span",{text:r});a.style.whiteSpace="nowrap",a.style.flex="0 0 auto";let o=i.createDiv();return o.style.flex="1 1 0",o.style.minWidth="0",o.style.overflow="visible",o}applyFluidEllipsis(n){let r=(n.tagName||n.tag||"").toLowerCase(),i=r==="select"||r==="input";n.style.boxSizing="border-box",n.style.width=i?"calc(100% - 2px)":"100%",n.style.maxWidth=i?"calc(100% - 2px)":"100%",n.style.minWidth="0",n.style.margin=i?"1px":"0",n.style.overflow=i?"visible":"hidden",n.style.textOverflow="ellipsis",n.style.whiteSpace="nowrap"}scheduleDebouncedTextSave(n,r,i){this.textDraftValues.set(n,r);let a=this.debouncedTextSaves.get(n);a&&globalThis.clearTimeout(a);let o=globalThis.setTimeout(()=>{i(this.textDraftValues.get(n)??r).finally(()=>{this.debouncedTextSaves.delete(n)})},vu);this.debouncedTextSaves.set(n,o)}clearDebouncedTextSaves(){for(let n of this.debouncedTextSaves.values())globalThis.clearTimeout(n);this.debouncedTextSaves.clear()}getDraftValue(n,r){return this.textDraftValues.get(n)??r}createSelect(n,r){let i=n.createEl("select");return i.dataset.selectKey=r,i}createFieldSelect(n,r){return this.createSelect(n,r)}appendOption(n,r,i){let a=n.createEl("option",{text:i});a.value=r}populateFieldSelect(n,r,i){n.empty(),this.appendOption(n,"",r.length>0?m("settings.mapping.selectFieldPlaceholder"):m("settings.cards.cardTypes.fieldsUnavailable"));for(let a of r)this.appendOption(n,a,a);n.value=i??""}populateFileDeckInsertLocationDropdown(n,r){n.addOption("body",m("settings.deck.insertLocation.options.body")),n.addOption("yaml",m("settings.deck.insertLocation.options.yaml")),n.setValue(r)}populateFolderDeckModeDropdown(n,r){n.addOption("off",m("settings.deck.folderDeckMode.options.off")),n.addOption("folder",m("settings.deck.folderDeckMode.options.folder")),n.addOption("folder-and-file",m("settings.deck.folderDeckMode.options.folderAndFile")),n.setValue(r)}getCardTitle(n){return n==="card-types"?m("settings.cards.cardTypes.title"):n==="sync-content"?m("settings.cards.syncContent.title"):n==="scope"?m("settings.cards.scope.title"):n==="deck"?m("settings.cards.deck.title"):m("settings.cards.commands.title")}getCardTypeLabel(n){return n==="basic"?m("settings.cards.cardTypes.rows.basic"):n==="qa-group"?m("settings.cards.cardTypes.rows.qaGroup"):n==="cloze"?m("settings.cards.cardTypes.rows.cloze"):m("settings.cards.cardTypes.rows.semanticQa")}};function _u(e){return e==="include"?m("settings.scope.summary.include"):e==="exclude"?m("settings.scope.summary.exclude"):m("settings.scope.summary.all")}function Iu(e,t){return JSON.stringify(e)===JSON.stringify(t)}function Hi(e){let t=new Set;for(let n of e){if(typeof n!="string")continue;let r=n.trim();r.length>0&&t.add(r)}return[...t].sort((n,r)=>n.localeCompare(r))}function Lu(e,t){return e.length!==t.length?!1:e.every((n,r)=>n===t[r])}function Nu(e){return e==="include"?m("settings.scope.treeDescription.include"):m("settings.scope.treeDescription.exclude")}function Pu(e){let t=e.split("/").filter(r=>r.length>0),n=[];for(let r=1;r0?e.message.trim():String(e)}var Pt=class{async runCollectBatches(t,n,r,i){if(t.length===0)return[];let a=Gu(t,n),o=new Array(a.length),u=0;return await Promise.all(Array.from({length:Math.min(r,a.length)},async()=>{for(;u(await i(a),[]))}};function Gu(e,t){let n=[];for(let r=0;ri.has(a))}function je(e,t){let n=Rt(e),r=Rt(t),i=new Set(n),a=new Set(r);return{addTags:n.filter(o=>!a.has(o)),removeTags:r.filter(o=>!i.has(o))}}var Bt=class{constructor(t,n=new _e,r=new Pt){this.ankiGateway=t;this.noteFieldMappingService=n;this.batchScheduler=r}async execute(t,n,r,i){let a=new Map,o=new Map,u=new Set,s=new Map,c=0,d=0,l=0,f=0,g=Array.from(new Set([...t.toUpdate,...t.toVerifyDeck,...t.toRewriteMarker,...t.toChangeDeck].flatMap(y=>y.noteId?[y.noteId]:[]))),p=await this.batchScheduler.runCollectBatches(g,100,1,y=>this.ankiGateway.getNoteSummaries(y)),M=new Map(p.map(y=>[y.noteId,y])),b=[],k=[],S=[],x=[],h=new Set(t.toChangeDeck.map(y=>y.card.syncKey));for(let y of t.toCreate)b.push(await this.requireRenderedCard(y,n,r));for(let y of t.toUpdate){if(y.noteId&&M.has(y.noteId)){let T=await this.requireRenderedCard(y,n,r),D=M.get(y.noteId);D&&D.modelName!==T.noteModel?S.push({plannedCard:y,renderedCard:T,summary:D}):k.push({plannedCard:y,renderedCard:T});continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toRewriteMarker)if(!s.has(y.card.syncKey)){if(y.noteId&&M.has(y.noteId)){s.set(y.card.syncKey,y),o.set(y.card.syncKey,y.noteId);continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toVerifyDeck){if(!y.noteId)continue;let T=M.get(y.noteId);T&&qu(T,y.deck,h.has(y.card.syncKey))&&(x.push(y),o.set(y.card.syncKey,y.noteId))}await this.batchScheduler.runVoidBatches(Array.from(new Set([...b.map(y=>y.deck),...x.map(y=>y.deck)])),50,1,y=>this.ankiGateway.ensureDecks(y));let w=await this.uploadMedia([...b,...k.map(y=>y.renderedCard),...S.map(y=>y.renderedCard)]),F=await this.batchScheduler.runCollectBatches(b,50,1,async y=>this.ankiGateway.addNotes(await Promise.all(y.map(async T=>({deckName:T.deck,modelName:T.noteModel,fields:await this.mapFields(T,i,a),tags:T.card.tagsHint})))));for(let y=0;y{await this.ankiGateway.updateNotes(await Promise.all(y.map(async({plannedCard:T,renderedCard:D})=>({noteId:T.noteId??0,fields:await this.mapFields(D,i,a)}))))}),await this.batchScheduler.runVoidBatches(S,25,1,async y=>{for(let{plannedCard:T,renderedCard:D,summary:O}of y){let W=await this.mapFields(D,i,a);try{await this.ankiGateway.updateNoteModel({noteId:T.noteId??0,modelName:D.noteModel,fields:W})}catch(v){throw Nt({noteId:T.noteId??0,fromModel:O.modelName,toModel:D.noteModel,error:v,location:`${T.card.filePath}:${T.card.blockStartLine}`})}}});let _=[...k,...S].flatMap(({plannedCard:y})=>{if(!y.noteId)return[];let T=M.get(y.noteId);if(!T)return[];let D=je(y.card.tagsHint,T.tags);return D.addTags.length===0&&D.removeTags.length===0?[]:[{noteId:y.noteId,addTags:D.addTags,removeTags:D.removeTags}]});await this.batchScheduler.runVoidBatches(_,50,1,y=>this.ankiGateway.syncNoteTags(y)),d+=k.length+S.length,l=S.length;for(let{plannedCard:y}of[...k,...S])y.noteId&&(u.add(y.card.syncKey),o.set(y.card.syncKey,y.noteId));let A=new Map;for(let y of x){let T=y.noteId;if(!T)continue;let D=M.get(T);if(!D||D.cardIds.length===0)continue;let O=A.get(y.deck)??new Set;for(let W of D.cardIds)O.add(W);A.set(y.deck,O)}await this.batchScheduler.runVoidBatches(Array.from(A.entries()).map(([y,T])=>({deckName:y,cardIds:Array.from(T)})),25,1,y=>this.ankiGateway.changeDecks(y)),f=x.length;for(let y of x)u.add(y.card.syncKey);return{created:c,updated:d,migratedNoteTypes:l,migratedDecks:f,uploadedMedia:w,markerWrites:Array.from(s.values()).map(y=>({...y,noteId:o.get(y.card.syncKey)??y.noteId})),resolvedNoteIds:o,touchedSyncKeys:u}}async requireRenderedCard(t,n,r){let i=n.get(t.card.syncKey);if(i)return i;let a=await r(t);return n.set(t.card.syncKey,a),a}async mapFields(t,n,r){let i=await this.getModelDetails(t.noteModel,r);return this.noteFieldMappingService.mapRenderedCard({type:t.card.cardType,noteModel:t.noteModel,renderedFields:t.renderedFields},i,n)}async getModelDetails(t,n){let r=n.get(t);if(r)return r;let i=this.ankiGateway.getModelDetails(t).catch(a=>{throw n.delete(t),a});return n.set(t,i),i}async uploadMedia(t){let n=new Map;for(let r of t)for(let i of r.media)n.set(`${i.kind}:${i.absolutePath}:${i.fileName}`,i);return await this.batchScheduler.runVoidBatches(Array.from(n.values()),10,3,r=>this.ankiGateway.storeMediaFiles(r)),n.size}};function qu(e,t,n){let r=e.deckNames?.filter(i=>i.length>0)??[];return r.length===0?n:r.some(i=>i!==t)}var Le=class{filter(t,n,r,i){let a=Gt(r),o=Gt(i);return t.filter(u=>u.path.toLowerCase().endsWith(".md")?this.isPathInScope(u.path,n,a,o):!1)}isPathInScope(t,n,r,i){let a=zu(t),o=Gt(r),u=Gt(i);return n==="include"?o.some(s=>Qi(a,s)):n==="exclude"?!u.some(s=>Qi(a,s)):!0}};function Gt(e){return e.map(Hu).filter(Boolean)}function Hu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function zu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+/,"")}function Qi(e,t){return e===t||e.startsWith(`${t}/`)}function Ke(e,t,n){return`${e}\0${t}\0${n}`}function qt(e,t,n){return`${e}\0group\0${t}\0${n}`}function be(e,t){return`${e}#${t}`}function Ne(e){let t=Ou(e.lines,e.startLine,e.markerAdapter),n=t.find(o=>o.valid);if(n?.marker){let o=e.lines.slice(0,n.index);return{contentLines:o,trailingLines:Uu(e.lines.slice(n.index+1)),contentEndLine:Ht(o,e.startLine,e.fallbackLine),markerLine:e.startLine+n.index,markerIndent:n.indent,marker:n.marker,markerState:"present-valid"}}let r=e.cutoffMode==="double-blank-lines"?Wu(e.lines):void 0;if(r){let o=t.find(s=>!s.valid&&s.index>=r.end),u=e.lines.slice(0,r.start);return{contentLines:u,trailingLines:e.lines.slice(r.end),contentEndLine:Ht(u,e.startLine,e.fallbackLine),markerLine:o?e.startLine+o.index:void 0,markerIndent:o?.indent,markerState:o?"present-invalid":"missing"}}let i=$u(e.lines),a=i===void 0?void 0:t.find(o=>!o.valid&&o.index===i);if(a){let o=e.lines.filter((u,s)=>s!==a.index);return{contentLines:o,trailingLines:[],contentEndLine:Ht(o,e.startLine,e.fallbackLine),markerLine:e.startLine+a.index,markerIndent:a.indent,markerState:"present-invalid"}}return{contentLines:e.lines,trailingLines:[],contentEndLine:Ht(e.lines,e.startLine,e.fallbackLine),markerState:"missing"}}function Ou(e,t,n){let r=[],i=null;for(let a=0;a=2&&n!==void 0)return{start:n,end:i};t=t?null:a.slice(0,3),n=void 0,r=0;continue}if(!t){if(!a){n??(n=i),r+=1;continue}if(r>=2&&n!==void 0)return{start:n,end:i};n=void 0,r=0}}if(r>=2&&n!==void 0)return{start:n,end:e.length}}function Ht(e,t,n){for(let r=e.length-1;r>=0;r-=1)if(e[r].trim())return t+r;return n}function $u(e){for(let t=e.length-1;t>=0;t-=1)if(e[t].trim())return t}function Uu(e){let t=0;for(;t1&&a.push({filePath:r,code:"deck_multiple_body_declarations",params:{marker:i}}),{bodyDeck:o[0],warnings:a}}};function Vu(e){if(e[0]?.trim()==="---"){for(let t=1;t!as(s))),u=[`qa-group:${n}`,...a.map(s=>`${s.title} +`,o=e.split(/\r?\n/),u=[],s=0,c=0;for(let d=0;d0||r.trackedGroups.length>0}async execute(t){let n=await this.pluginStateRepository.load(),r=yi(n,t);if(r.trackedCards.length===0&&r.trackedGroups.length===0)return nu();let i=r.noteIds;i.length>0&&await this.ankiGateway.deleteNotes(i);let a=await this.markdownMarkerRemovalService.remove(t,r.trackedCards.map(u=>({noteId:u.noteId})),r.trackedGroups.map(u=>({noteId:u.noteId,groupId:u.groupId,blockStartLine:u.blockStartLine}))),o=tu(n,t,r);return await this.pluginStateRepository.save(o),{trackedCards:r.trackedCards.length,trackedGroups:r.trackedGroups.length,deletedNotes:i.length,removedMarkers:a.removedMarkers,removedCardMarkers:a.removedCardMarkers,removedGroupMarkers:a.removedGroupMarkers,deletedLocalRecords:r.trackedCards.length+r.trackedGroups.length,conflictFiles:a.conflictFiles,failureFiles:a.failureFiles}}};function yi(e,t){let n=new Set,r=new Set,i=e.groupBlocks??{};for(let u of e.files[t]?.noteIds??[]){let s=N(u);e.cards[s]&&n.add(s)}for(let u of e.files[t]?.groupIds??[])i[u]&&r.add(u);for(let u of Object.values(e.cards))u.filePath===t&&n.add(N(u.noteId));for(let[u,s]of Object.entries(i))s.filePath===t&&r.add(u);let a=Array.from(n).map(u=>e.cards[u]).filter(u=>!!u),o=Array.from(r).map(u=>i[u]).filter(u=>!!u);return{trackedCards:a,trackedGroups:o,noteIds:Array.from(new Set([...a.map(u=>u.noteId),...o.map(u=>u.noteId)]))}}function tu(e,t,n){let r={...e.cards},i={...e.groupBlocks??{}};for(let o of n.trackedCards)delete r[N(o.noteId)];for(let o of n.trackedGroups)delete i[o.groupId];let a={...e.files};return delete a[t],{files:a,cards:r,groupBlocks:e.groupBlocks?i:void 0,pendingWriteBack:e.pendingWriteBack.filter(o=>o.filePath!==t)}}function nu(){return{trackedCards:0,trackedGroups:0,deletedNotes:0,removedMarkers:0,removedCardMarkers:0,removedGroupMarkers:0,deletedLocalRecords:0,conflictFiles:[],failureFiles:[]}}var bt=class{constructor(t){this.manualSyncService=t}async execute(t,n){return this.manualSyncService.syncFile(t,n)}};var yt=class{constructor(t){this.manualSyncService=t}async execute(t){return this.manualSyncService.rebuildIndex(t)}};var xt=class{constructor(t){this.manualSyncService=t}async execute(t){return this.manualSyncService.syncVault(t)}};var Si=require("obsidian");function xi(e,t){return{model:{name:e,...t}}}var St=class{constructor(t){this.getBaseUrl=t}async ensureDeckExists(t){await this.invoke("createDeck",{deck:t})}async ensureDecks(t){let n=Array.from(new Set(t));await this.invokeMulti(n.map(r=>({action:"createDeck",params:{deck:r}})))}async listNoteModels(){return this.invoke("modelNames",{})}async listDeckNames(){let t=await this.invoke("deckNamesAndIds",{});return Object.keys(t)}async getModelFieldNames(t){return this.invoke("modelFieldNames",{modelName:t})}async getModelFieldNamesByModelNames(t){let n=Array.from(new Set(t.map(i=>i.trim()).filter(i=>i.length>0)));if(n.length===0)return{};let r=await this.invoke("multi",{actions:n.map(i=>({action:"modelFieldNames",params:{modelName:i}}))});return n.reduce((i,a,o)=>{let u=ru(r[o]);return u&&(i[a]=u),i},{})}async getModelTemplates(t){let n=await this.invoke("modelTemplates",{modelName:t});return Object.fromEntries(Object.entries(n).map(([r,i])=>[r,{name:r,front:i.Front??"",back:i.Back??""}]))}async getModelStyling(t){let n=await this.invoke("modelStyling",{modelName:t});return typeof n=="string"?n:n.css??""}async createModel(t){await this.invoke("createModel",{modelName:t.modelName,inOrderFields:t.fieldNames,css:t.css,isCloze:!!t.isCloze,cardTemplates:t.templates.map(n=>({Name:n.name,Front:n.front,Back:n.back}))})}async addModelField(t,n){await this.invoke("modelFieldAdd",{modelName:t,fieldName:n})}async addModelTemplate(t,n){await this.invoke("modelTemplateAdd",{modelName:t,templateName:n.name,Front:n.front,Back:n.back})}async updateModelTemplate(t,n){await this.invoke("updateModelTemplates",xi(t,{templates:{[n.name]:{Front:n.front,Back:n.back}}}))}async updateModelStyling(t,n){await this.invoke("updateModelStyling",xi(t,{css:n}))}async findNoteIds(t){return this.invoke("findNotes",{query:t})}async getNoteDetails(t){if(t.length===0)return[];let n=await this.invoke("notesInfo",{notes:t}),r=n.flatMap(a=>Array.isArray(a?.cards)?a.cards:[]),i=new Map;if(r.length>0){let a=await this.invoke("cardsInfo",{cards:r});for(let o of a)!o||typeof o.cardId!="number"||typeof o.deckName!="string"||i.set(o.cardId,o.deckName)}return n.flatMap(a=>{if(!a||typeof a.noteId!="number"||typeof a.modelName!="string")return[];let o=Array.isArray(a.cards)?a.cards:[],u=Object.fromEntries(Object.entries(a.fields??{}).map(([s,c])=>[s,c?.value??""]));return[{noteId:a.noteId,modelName:a.modelName,cardIds:o,deckNames:Array.from(new Set(o.map(s=>i.get(s)).filter(s=>typeof s=="string"))),tags:Array.isArray(a.tags)?a.tags.filter(s=>typeof s=="string"):[],fields:u}]})}async getModelDetails(t){let n=await this.getModelFieldNames(t),r=t.toLowerCase().includes("cloze");try{let i=await this.getModelTemplates(t);r=r||Object.keys(i).some(a=>a.toLowerCase().includes("cloze"))}catch{r=r||n.some(i=>i.toLowerCase()==="text")}return{fieldNames:n,isCloze:r}}async getDeckStats(t){if(t.length===0)return[];let n=await this.invoke("deckNamesAndIds",{}),r=await this.invoke("getDeckStats",{decks:t});return t.map(i=>({deckName:i,noteCount:iu(r,n[i])}))}async getNoteSummaries(t){return(await this.getNoteDetails(t)).map(n=>({noteId:n.noteId,modelName:n.modelName,cardIds:n.cardIds,deckNames:n.deckNames,tags:n.tags}))}async addNote(t){return this.invoke("addNote",{note:{deckName:t.deckName,modelName:t.modelName,fields:t.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:t.tags}})}async addNotes(t){return this.invokeMulti(t.map(n=>({action:"addNote",params:{note:{deckName:n.deckName,modelName:n.modelName,fields:n.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:n.tags}}})))}async deleteNotes(t){t.length!==0&&await this.invoke("deleteNotes",{notes:t})}async updateNote(t){if(await this.invoke("updateNoteFields",{note:{id:t.noteId,fields:t.fields}}),!t.deckName)return;let r=(await this.invoke("notesInfo",{notes:[t.noteId]}))[0]?.cards??[];r.length>0&&await this.invoke("changeDeck",{cards:r,deck:t.deckName})}async updateNoteModel(t){try{await this.invoke("updateNoteModel",{note:{id:t.noteId,modelName:t.modelName,fields:t.fields}})}catch(n){throw new Error(au("updateNoteModel",{noteId:t.noteId,modelName:t.modelName},n))}}async updateNotes(t){await this.invokeMulti(t.map(n=>({action:"updateNoteFields",params:{note:{id:n.noteId,fields:n.fields}}})))}async syncNoteTags(t){let n=[];for(let r of t)r.removeTags.length>0&&n.push({action:"removeTags",params:{notes:[r.noteId],tags:r.removeTags.join(" ")}}),r.addTags.length>0&&n.push({action:"addTags",params:{notes:[r.noteId],tags:r.addTags.join(" ")}});await this.invokeMulti(n)}async changeDecks(t){await this.invokeMulti(t.filter(n=>n.cardIds.length>0).map(n=>({action:"changeDeck",params:{cards:n.cardIds,deck:n.deckName}})))}async deleteDecks(t){let n=Array.from(new Set(t));n.length!==0&&await this.invoke("deleteDecks",{decks:n,cardsToo:!0})}async storeMedia(t){await this.invoke("storeMediaFile",{filename:t.fileName,path:t.absolutePath})}async storeMediaFiles(t){await this.invokeMulti(t.map(n=>({action:"storeMediaFile",params:{filename:n.fileName,path:n.absolutePath}})))}async invoke(t,n){let i=(await(0,Si.requestUrl)({url:this.getBaseUrl(),method:"POST",contentType:"application/json",body:JSON.stringify({action:t,version:6,params:n})})).json;if(i.error)throw new Error(i.error);return i.result}async invokeMulti(t){return t.length===0?[]:this.invoke("multi",{actions:t})}};function ru(e){if(Array.isArray(e))return e.filter(n=>typeof n=="string");if(!e||typeof e!="object"||Array.isArray(e))return;let t=e;if(!t.error&&Array.isArray(t.result))return t.result.filter(n=>typeof n=="string")}function iu(e,t){if(!e||typeof e!="object"||typeof t!="number")return;let n=e[String(t)];if(!n||typeof n!="object")return;let i=n.total_in_deck;if(typeof i=="number"&&Number.isFinite(i))return i}function au(e,t,n){let r=typeof t.noteId=="number"&&typeof t.modelName=="string"?` for note ${t.noteId} to model ${t.modelName}`:typeof t.noteId=="number"?` for note ${t.noteId}`:"";return`AnkiConnect ${e} failed${r}: ${ou(n)}`}function ou(e){return e instanceof Error&&e.message.trim().length>0?e.message.trim():String(e)}var Ct=class{constructor(t){this.plugin=t}async load(){return await this.plugin.loadData()??null}async save(t){await this.plugin.saveData(t)}};var ue=require("obsidian");function z(e){let t=2166136261;for(let n=0;n>>0).toString(16).padStart(8,"0")}function Mt(e){if(!e)return[];let t=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let a=(r.startsWith("#")?r.slice(1):r).split("/").map(u=>u.trim()).filter(u=>u.length>0);if(a.length===0)continue;let o=a.join("::");n.has(o)||(n.add(o),t.push(o))}return t}var uu=new Set(["png","jpg","jpeg","gif","bmp","svg","webp","tiff"]),su=new Set(["wav","m4a","flac","mp3","wma","aac","webm","ogg"]),vt=class{constructor(t){this.app=t}async listFolderTree(){return this.app.vault.getRoot().children.filter(t=>t instanceof ue.TFolder).map(t=>this.toFolderTreeNode(t))}async listMarkdownFileRefs(){return this.app.vault.getMarkdownFiles().map(t=>({path:t.path,basename:t.basename,mtime:t.stat.mtime,size:t.stat.size}))}async listMarkdownFiles(){let t=this.app.vault.getMarkdownFiles();return Promise.all(t.map(n=>this.toSourceFile(n)))}async getMarkdownFile(t){let n=this.app.vault.getAbstractFileByPath(t);return!(n instanceof ue.TFile)||n.extension.toLowerCase()!=="md"?null:this.toSourceFile(n)}async readMarkdownFile(t){return this.getMarkdownFile(t)}async replaceMarkdownFile(t,n,r){let i=this.app.vault.getAbstractFileByPath(t);if(!(i instanceof ue.TFile)||i.extension.toLowerCase()!=="md")throw new pt(t);if(await this.app.vault.cachedRead(i)!==n)throw new fe(t);await this.app.vault.modify(i,r)}resolveWikiLink(t,n){let{alias:r,linkPath:i}=Ci(t),o=this.app.metadataCache.getFirstLinkpathDest(wt(i),n)?.path??wt(i),u=r||cu(i);return{url:this.createObsidianUrl(i.includes("#")?`${o}${i.slice(i.indexOf("#"))}`:o),displayText:u}}resolveEmbed(t,n){let{alias:r,linkPath:i}=Ci(t),a=this.app.metadataCache.getFirstLinkpathDest(wt(i),n);if(!(a instanceof ue.TFile))return null;let o=a.extension.toLowerCase(),u=uu.has(o)?"image":su.has(o)?"audio":null;if(!u)return null;let s=du(this.app,a.path),c=`${z(a.path)}-${a.name}`;return{kind:u,fileName:c,absolutePath:s,altText:r||a.name}}createBacklink(t){return this.createObsidianUrl(`${t.filePath}#${lu(t.headingText)}`)}async toSourceFile(t){let n=this.app.metadataCache.getFileCache(t);return{path:t.path,basename:t.basename,content:await this.app.vault.cachedRead(t),tags:pu(n)}}createObsidianUrl(t){return`obsidian://open?vault=${encodeURIComponent(this.app.vault.getName())}&file=${encodeURIComponent(t)}`}toFolderTreeNode(t){return{path:t.path,name:t.name,children:t.children.filter(n=>n instanceof ue.TFolder).map(n=>this.toFolderTreeNode(n))}}};function Ci(e){let[t,n]=e.split("|",2).map(r=>r.trim());return{linkPath:t,alias:n||void 0}}function wt(e){return e.split("#",1)[0]}function cu(e){let t=wt(e);return(t.split("/").pop()??t).replace(/\.[^.]+$/,"")||e}function du(e,t){let n=e.vault.adapter;if(!n.getFullPath)throw new Error("The active vault adapter does not expose an absolute filesystem path.");return n.getFullPath(t)}function lu(e){return e.replace(/(?:\s+#\S+)+$/g,t=>t.replace(/(^|\s)#(\S+)/g,"$1$2"))}function pu(e){return e?Mt((0,ue.getAllTags)(e)):[]}var Ft=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{},n=di(t.settings);return oe(n),n}async save(t){let n=ke(t);oe(n);let r=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...r,settings:n})}};var Tt=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{};return fu(t.pluginState)}async save(t){let n=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...n,pluginState:t})}};function fu(e){if(!e)return bi();let t=e.cards??{},n={};for(let a of Object.values(t)){let o=At(a.noteId);if(o===void 0)continue;let u=gu(a,o),s=N(o),c=n[s];(!c||c.lastSyncedAt<=u.lastSyncedAt)&&(n[s]=u)}let r={};for(let[a,o]of Object.entries(e.files??{}))r[a]={filePath:a,fileHash:typeof o.fileHash=="string"?o.fileHash:"",fileStamp:typeof o.fileStamp=="string"?o.fileStamp:"",deckRulesFingerprint:typeof o.deckRulesFingerprint=="string"?o.deckRulesFingerprint:void 0,lastIndexedAt:typeof o.lastIndexedAt=="number"?o.lastIndexedAt:0,noteIds:ku(o,t,n),groupIds:bu(o,e.groupBlocks??{})};let i={};for(let[a,o]of Object.entries(e.groupBlocks??{})){let u=hu(o,a);if(!u)continue;let s=i[a];(!s||s.lastSyncedAt<=u.lastSyncedAt)&&(i[a]=u)}return{files:r,cards:n,groupBlocks:i,pendingWriteBack:[]}}function gu(e,t){return{noteId:t,filePath:typeof e.filePath=="string"?e.filePath:"",heading:typeof e.heading=="string"?e.heading:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.heading=="string"?e.heading:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,bodyMarkdown:typeof e.bodyMarkdown=="string"?e.bodyMarkdown:"",cardType:mu(e.cardType),blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",renderConfigHash:typeof e.renderConfigHash=="string"?e.renderConfigHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(n=>typeof n=="string"):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}}function mu(e){return e==="cloze"||e==="semantic-qa"?e:"basic"}function hu(e,t){let n=At(e.noteId);return n===void 0||!t.trim()?null:{groupId:t,noteId:n,filePath:typeof e.filePath=="string"?e.filePath:"",headingText:typeof e.headingText=="string"?e.headingText:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.headingText=="string"?e.headingText:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,stem:typeof e.stem=="string"?e.stem:"",src:typeof e.src=="string"?e.src:"",blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,markerIndent:typeof e.markerIndent=="string"?e.markerIndent:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(r=>typeof r=="string"):[],items:Array.isArray(e.items)?e.items.flatMap(r=>{if(!r||typeof r!="object")return[];let i=r;return typeof i.title!="string"||typeof i.answer!="string"||typeof i.ordinalInMarkdown!="number"?[]:[{itemId:typeof i.itemId=="string"?i.itemId:void 0,title:i.title,answer:i.answer,slot:typeof i.slot=="number"?i.slot:void 0,ordinalInMarkdown:i.ordinalInMarkdown}]}):[],freeSlots:Array.isArray(e.freeSlots)?e.freeSlots.filter(r=>typeof r=="number"&&Number.isInteger(r)&&r>0):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}}function ku(e,t,n){let r=new Set;if(Array.isArray(e.noteIds))for(let i of e.noteIds){let a=At(i);a!==void 0&&n[N(a)]&&r.add(a)}if(Array.isArray(e.cardIds))for(let i of e.cardIds){let a=At(t[i]?.noteId);a!==void 0&&n[N(a)]&&r.add(a)}return Array.from(r)}function bu(e,t){return Array.isArray(e.groupIds)?e.groupIds.filter(n=>typeof n=="string"&&!!t[n]):[]}function At(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:void 0}function Mi(e){e.addCommand({id:"sync-current-file-to-anki",name:m("commands.syncCurrentFileToAnki"),callback:()=>{e.runSyncCurrentFile()}}),e.addCommand({id:"sync-vault-to-anki",name:m("commands.syncVaultToAnki"),callback:()=>{e.runSyncVault()}}),e.addCommand({id:"clear-current-file-synced-cards",name:m("commands.clearCurrentFileSyncedCards"),callback:()=>{e.runClearCurrentFileSyncedCards()}}),e.addCommand({id:"cleanup-empty-decks",name:m("commands.cleanupEmptyDecks"),callback:()=>{e.runCleanupEmptyDecks()}})}var Ve=require("obsidian");var Dt=class extends Ve.Modal{constructor(n,r){super(n);this.candidateDeckNames=r;this.deckToggles=new Map;this.selectedDeckNames=new Set;this.resolvedValue=null}openAndGetSelection(){return new Promise(n=>{this.resolver=n,this.open()})}onOpen(){let{contentEl:n}=this;n.empty(),n.createEl("h2",{text:m("modal.emptyDeck.title")}),n.createEl("p",{text:m("modal.emptyDeck.description")});for(let i of this.candidateDeckNames)new Ve.Setting(n).setName(i).addToggle(a=>{this.deckToggles.set(i,a),a.setValue(!1).onChange(o=>{o?this.selectedDeckNames.add(i):this.selectedDeckNames.delete(i),this.refreshSelectionState()})});let r=new Ve.Setting(n).addButton(i=>{i.setButtonText(m("modal.emptyDeck.selectAll")).onClick(()=>{this.selectAllDecks()})}).addButton(i=>{i.setButtonText(m("modal.emptyDeck.clearAll")).onClick(()=>{this.clearSelectedDecks()})}).addButton(i=>{i.setButtonText(m("modal.emptyDeck.invert")).onClick(()=>{this.invertSelectedDecks()})}).addButton(i=>{i.setButtonText(m("modal.emptyDeck.cancel")).onClick(()=>{this.finish(null)})}).addButton(i=>{this.deleteButton=i,i.setButtonText(m("modal.emptyDeck.deleteSelected")).setCta().onClick(()=>{this.finish(Array.from(this.selectedDeckNames))})});this.selectionCountEl=r.settingEl.createEl("span",{text:this.getSelectionCountText()}),this.selectionCountEl.addClass("anki-helper-empty-deck-selection-count"),this.refreshSelectionState()}onClose(){let n=this.resolver,r=this.resolvedValue;this.contentEl.empty(),this.deckToggles.clear(),this.deleteButton=void 0,this.selectionCountEl=void 0,this.resolver=void 0,this.resolvedValue=null,this.selectedDeckNames.clear(),n?.(r)}finish(n){this.resolvedValue=n,this.close()}selectAllDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.selectedDeckNames.add(n),this.deckToggles.get(n)?.setValue(!0);this.refreshSelectionState()}clearSelectedDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.deckToggles.get(n)?.setValue(!1);this.refreshSelectionState()}invertSelectedDecks(){let n=new Set;for(let r of this.candidateDeckNames){let i=!this.selectedDeckNames.has(r);this.deckToggles.get(r)?.setValue(i),i&&n.add(r)}this.selectedDeckNames.clear();for(let r of n)this.selectedDeckNames.add(r);this.refreshSelectionState()}refreshSelectionState(){this.deleteButton?.setDisabled(this.selectedDeckNames.size===0),this.selectionCountEl&&(this.selectionCountEl.textContent=this.getSelectionCountText())}getSelectionCountText(){return m("modal.emptyDeck.selectionCount",{selected:this.selectedDeckNames.size,total:this.candidateDeckNames.length})}};var En=require("obsidian");var Et=class{info(t){new En.Notice(t,5e3)}error(t){new En.Notice(t,8e3)}showSyncSummary(t,n){let r=ie(),o=[m(t==="currentFile"?"notice.summary.currentFileSync":"notice.summary.vaultSync",{scannedFiles:n.scannedFiles,scannedCards:n.scannedCards,created:n.created,updated:n.updated,migratedNoteTypes:n.migratedNoteTypes,migratedDecks:n.migratedDecks,orphaned:n.orphaned,uploadedMedia:n.uploadedMedia,skippedUnchangedCards:n.skippedUnchangedCards})];n.markerWriteConflictFiles.length>0&&o.push(m("notice.summary.markerWriteConflicts",{files:ae(r,n.markerWriteConflictFiles)})),n.warnings.length>0&&o.push(m("notice.summary.warningsCount",{count:n.warnings.length})),this.info(o.join(" "));for(let u of n.warnings.slice(0,3))this.info(this.renderDeckWarning(u))}showRebuildSummary(t){let n=ie(),r=[m("notice.summary.rebuild",{scannedFiles:t.scannedFiles,scannedCards:t.scannedCards,migratedDecks:t.migratedDecks,orphaned:t.orphaned,rewrittenMarkers:t.rewrittenMarkers,skippedUnchangedCards:t.skippedUnchangedCards})];t.markerWriteConflictFiles.length>0&&r.push(m("notice.summary.markerWriteConflicts",{files:ae(n,t.markerWriteConflictFiles)})),t.warnings.length>0&&r.push(m("notice.summary.warningsCount",{count:t.warnings.length})),this.info(r.join(" "));for(let i of t.warnings.slice(0,3))this.info(this.renderDeckWarning(i))}showClearCurrentFileSummary(t){let n=ie(),r=[m("notice.summary.clearCurrentFile",{trackedCards:t.trackedCards,trackedGroups:t.trackedGroups,deletedNotes:t.deletedNotes,removedMarkers:t.removedMarkers,removedCardMarkers:t.removedCardMarkers,removedGroupMarkers:t.removedGroupMarkers,deletedLocalRecords:t.deletedLocalRecords})];t.conflictFiles.length>0&&r.push(m("notice.summary.markerRemovalConflicts",{files:ae(n,t.conflictFiles)})),t.failureFiles.length>0&&r.push(m("notice.summary.failures",{items:Zr(t.failureFiles)})),this.info(r.join(" "))}showCleanupEmptyDecksSummary(t){let n=ie(),r=[m("notice.summary.cleanupEmptyDecks",{candidateCount:t.candidateCount,selectedCount:t.selectedCount,deletedCount:t.deletedCount,skippedCount:t.skippedDeckNames.length})];t.skippedDeckNames.length>0&&r.push(m("notice.summary.skippedDecks",{decks:ae(n,t.skippedDeckNames)})),this.info(r.join(" "))}renderDeckWarning(t){return m(yu(t.code),t.params)}};function yu(e){switch(e){case"deck_conflict_yaml_body":return"warnings.deck.conflictYamlBody";case"deck_multiple_body_declarations":return"warnings.deck.multipleBodyDeclarations";case"deck_invalid_folder_segment":return"warnings.deck.invalidFolderSegment";case"deck_fallback_default":return"warnings.deck.fallbackDefault"}}var G=require("obsidian");function wi(e){return e==="cloze"}function vi(e){return e!=="cloze"}var _e=class{map(t,n,r){return this.mapRenderedCard(t,n,r)}mapRenderedCard(t,n,r){let i=this.getRequiredMapping(t,r);return this.validateMapping(i,n),vi(t.type)?this.mapBasic(t,i):this.mapCloze(t,n,i)}suggest(t,n,r,i=Date.now()){if(t==="qa-group")throw new Error("QaGroupFieldMappingService must be used for qa-group mappings.");return xu(t)?{cardType:t,modelName:n,loadedFieldNames:[...r],titleField:_t(r,["Front","Title"])??r[0],bodyField:_t(r,["Back","Body","Answer"])??r.find(a=>a!==(_t(r,["Front","Title"])??r[0])),loadedAt:i}:{cardType:t,modelName:n,loadedFieldNames:[...r],mainField:_t(r,["Text","Body","Content"])??r[0],loadedAt:i}}validateMapping(t,n){if(!Cn(t)&&!Ur(t))throw new Error("QaGroupFieldMappingService validates qa-group mappings.");let r=new Set(n.fieldNames);if(Cn(t)){if(!t.titleField||!t.bodyField)throw new C(Fi(t.cardType),{modelName:t.modelName});if(t.titleField===t.bodyField)throw new C(Cu(t.cardType),{modelName:t.modelName});let i=[t.titleField,t.bodyField].filter(a=>!r.has(a));if(i.length>0)throw new C("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:i.map(a=>`"${a}"`)});return}if(!t.mainField)throw new C("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.modelName});if(!n.isCloze)throw new C("errors.noteFieldMapping.clozeIncompatible",{modelName:t.modelName});if(!r.has(t.mainField))throw new C("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:[`"${t.mainField}"`]})}mapBasic(t,n){let r=n.titleField,i=n.bodyField;if(!r||!i)throw new C(Fi(t.type),{modelName:t.noteModel});return{[r]:t.renderedFields.title,[i]:t.renderedFields.body}}mapCloze(t,n,r){if(!n.isCloze)throw new C("errors.noteFieldMapping.clozeIncompatible",{modelName:t.noteModel});if(!r.mainField)throw new C("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.noteModel});return{[r.mainField]:`${t.renderedFields.title}

${t.renderedFields.body}`}}getRequiredMapping(t,n){let r=n[L(t.type,t.noteModel)];if(!r)throw new C(Su(t.type),{modelName:t.noteModel});return r}};function xu(e){return e==="basic"||e==="semantic-qa"}function Su(e){return e==="cloze"?"errors.noteFieldMapping.missingSavedMapping.cloze":e==="semantic-qa"?"errors.noteFieldMapping.missingSavedMapping.semanticQa":"errors.noteFieldMapping.missingSavedMapping.basic"}function Fi(e){return e==="cloze"?"errors.noteFieldMapping.incompleteSavedMapping.cloze":e==="semantic-qa"?"errors.noteFieldMapping.incompleteSavedMapping.semanticQa":"errors.noteFieldMapping.incompleteSavedMapping.basic"}function Cu(e){return e==="semantic-qa"?"errors.noteFieldMapping.titleBodyMustDiffer.semanticQa":"errors.noteFieldMapping.titleBodyMustDiffer.basic"}function _t(e,t){return e.find(n=>t.some(r=>r.toLowerCase()===n.toLowerCase()))}function Di(e,t){let n=new Set(_n(t));return e.map(r=>_i(r,n,!1))}function Ei(e,t,n,r){let i=Mu(e),a=new Set(_n(t).filter(u=>i.nodeByPath.has(u)));if(!i.nodeByPath.has(n))return It(e,Array.from(a));if(r)return Ti(n,a,i.parentByPath)||(Ai(a,n),a.add(n)),It(e,Array.from(a));let o=Ti(n,a,i.parentByPath);if(o&&(a.delete(o),o!==n)){let u=i.nodeByPath.get(o);if(u)for(let s of Li(u,n))a.add(s)}return Ai(a,n),It(e,Array.from(a))}function It(e,t){let n=new Set(_n(t));return e.flatMap(r=>Ii(r,n).paths)}function _i(e,t,n){let r=n||t.has(e.path),i=e.children.map(o=>_i(o,t,r));if(r)return{...e,checked:!0,indeterminate:!1,children:i};let a=i.some(o=>o.checked||o.indeterminate);return{...e,checked:!1,indeterminate:a,children:i}}function Ii(e,t){return t.has(e.path)?{paths:[e.path]}:e.children.length===0?{paths:[]}:{paths:e.children.map(r=>Ii(r,t)).flatMap(r=>r.paths)}}function Mu(e){let t=new Map,n=new Map,r=(i,a)=>{t.set(i.path,i),n.set(i.path,a);for(let o of i.children)r(o,i.path)};for(let i of e)r(i,void 0);return{nodeByPath:t,parentByPath:n}}function Ti(e,t,n){let r=e;for(;r;){if(t.has(r))return r;r=n.get(r)}}function Ai(e,t){for(let n of Array.from(e))(n===t||Ni(n,t))&&e.delete(n)}function Li(e,t){if(e.path===t)return[];let n=e.children.find(i=>i.path===t||Ni(t,i.path));if(!n)return[e.path];let r=[];for(let i of e.children){if(i.path===n.path){r.push(...Li(i,t));continue}r.push(i.path)}return r}function _n(e){return Array.from(new Set(e.map(t=>wu(t)).filter(Boolean)))}function wu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function Ni(e,t){return e===t||e.startsWith(`${t}/`)}var Pi={key:"settings.scope.loading"},vu=500,Ri=["card-types","sync-content","deck","scope","commands"],In=["basic","qa-group","cloze"],Fu=8,Tu=64,Ie="var(--modal-background, var(--background-primary))",Ln="--ahs-settings-page-header-height",zi="--ahs-settings-sticky-card-gap",Oi=`${Tu}px`,Wi=`${Fu}px`,Au=`var(${Ln}, ${Oi})`,Du=`var(${zi}, ${Wi})`,Bi="12px",Eu="-128px",Gi="-24px",qi="32px",Lt=class extends G.PluginSettingTab{constructor(n){super(n.app,n);this.noteFieldMappingService=new _e;this.qaGroupFieldMappingService=new pe;this.availableNoteModels=[];this.draftMappings={};this.loadedModelDetails={};this.debouncedTextSaves=new Map;this.textDraftValues=new Map;this.cardShells=new Map;this.expandedCardIds=new Set;this.expandedFolderPaths=new Set;this.folderTree=[];this.folderTreeStatus=Pi;this.folderTreeLoadPromise=null;this.hasLoadedFolderTree=!1;this.displayInitialized=!1;this.ankiConfigLoading=!1;this.cardTypeStatusOverride=null;this.noteTypeCacheCheckStatus="idle";this.noteTypeCacheCheckPromise=null;this.detectedAnkiNoteTypeCache=null;this.noteTypeCacheCheckToken=0;this.pageHeaderResizeObserver=null;this.scopeNeedsSelectedAncestorExpansion=!0;this.plugin=n}hide(){this.disconnectPageHeaderResizeObserver(),super.hide(),this.displayInitialized=!1,this.cardShells.clear(),this.clearDebouncedTextSaves(),this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus="idle",this.noteTypeCacheCheckPromise=null,this.detectedAnkiNoteTypeCache=null,this.noteTypeCacheCheckToken+=1,this.scopeNeedsSelectedAncestorExpansion=!0}display(){let{containerEl:n}=this,r=n.scrollTop;if(!this.displayInitialized){n.style.setProperty(Ln,Oi),n.style.setProperty(zi,Wi),n.empty();let i=n.createDiv();i.dataset.settingsPageHeader="true",i.style.position="sticky",i.style.top="0px",i.style.zIndex="300",i.style.width="100%",i.style.boxSizing="border-box",i.style.paddingTop=Bi,i.style.paddingBottom=`calc(${Bi} + ${Du})`,i.style.marginBottom="0",i.style.overflow="visible",i.style.background=Ie,i.style.backgroundColor=Ie,i.style.boxShadow="none";let a=i.createDiv();a.dataset.settingsPageHeaderMask="true",a.style.position="absolute",a.style.top=Eu,a.style.left=Gi,a.style.right=Gi,a.style.bottom="0px",a.style.zIndex="0",a.style.pointerEvents="none",a.style.background=Ie,a.style.backgroundColor=Ie;let o=i.createEl("h2",{text:m("settings.pluginTitle")});o.style.margin="0",o.style.position="relative",o.style.zIndex="1",this.observePageHeaderHeight(i);let u=n.createDiv();u.dataset.settingsCardsContainer="true",this.initializeCards(u),this.displayInitialized=!0}for(let i of Ri)this.renderCard(i);n.scrollTop=r}initializeCards(n){this.cardShells.clear();for(let r of Ri){let i=n.createDiv();i.dataset.settingsCard=r;let a=i.createEl("button");a.type="button",a.dataset.settingsCardToggle=r,a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="flex-start",a.style.position="sticky",a.style.top=Au,a.style.zIndex="200",a.style.width="100%",a.style.maxWidth="100%",a.style.boxSizing="border-box",a.style.padding="10px 14px",a.style.fontSize="1.5em",a.style.fontWeight="600",a.style.background=Ie,a.style.backgroundColor=Ie,a.style.border="2px solid var(--background-modifier-border)",a.style.borderRadius="0",a.style.marginBottom="8px",a.style.textAlign="left",a.style.boxShadow="none",a.addEventListener("click",()=>{this.toggleCard(r)});let o=i.createDiv();o.dataset.settingsCardBody=r,this.cardShells.set(r,{cardEl:i,headerEl:a,bodyEl:o})}}toggleCard(n){this.expandedCardIds.has(n)?this.expandedCardIds.delete(n):this.expandedCardIds.add(n),this.renderCard(n)}renderCard(n){let r=this.cardShells.get(n);if(!r)return;let i=this.expandedCardIds.has(n);if(r.headerEl.textContent=`${i?"\u25BE":"\u25B8"} ${this.getCardTitle(n)}`,r.headerEl.setAttr("aria-expanded",String(i)),r.bodyEl.style.display=i?"block":"none",r.bodyEl.empty(),!!i){if(n==="card-types"){this.renderCardTypesCard(r.bodyEl);return}if(n==="sync-content"){this.renderSyncContentCard(r.bodyEl);return}if(n==="scope"){this.renderScopeCard(r.bodyEl);return}if(n==="deck"){this.renderDeckCard(r.bodyEl);return}this.renderCommandsCard(r.bodyEl)}}observePageHeaderHeight(n){this.disconnectPageHeaderResizeObserver(),this.updatePageHeaderHeight(n),!(typeof ResizeObserver>"u")&&(this.pageHeaderResizeObserver=new ResizeObserver(()=>{this.updatePageHeaderHeight(n)}),this.pageHeaderResizeObserver.observe(n))}updatePageHeaderHeight(n){let r=n.getBoundingClientRect().height;!Number.isFinite(r)||r<=0||this.containerEl.style.setProperty(Ln,`${Math.round(r)}px`)}disconnectPageHeaderResizeObserver(){this.pageHeaderResizeObserver?.disconnect(),this.pageHeaderResizeObserver=null}renderCardTypesCard(n){this.hydrateVisibleCardTypeCaches(),this.maybeStartNoteTypeCacheCheck();let r=n.createDiv();r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="flex-start",r.style.gap="8px";let i=r.createEl("button",{text:this.ankiConfigLoading?m("settings.cards.cardTypes.loadAnki.loading"):m("settings.cards.cardTypes.loadAnki.button")});i.type="button",i.dataset.cardTypesRefresh="true",i.disabled=this.ankiConfigLoading,i.addEventListener("click",()=>this.loadAnkiCardTypeConfig()),r.createEl("span",{text:`${m("settings.cards.cardTypes.statusLabel")}${Te(this.getCardTypeStatusMessage())}`});let a=n.createDiv();a.dataset.cardTypeList="true",a.style.display="flex",a.style.flexDirection="column",a.style.gap="14px";for(let o of In)this.renderCardTypeBlock(a,o)}renderCardTypeBlock(n,r){let i=this.plugin.settings.cardTypeConfigs[r],a=n.createDiv();a.dataset.cardTypeConfig=r,a.style.display="flex",a.style.flexDirection="column",a.style.gap="8px",a.style.padding="12px",a.style.border="1px solid var(--background-modifier-border)",a.style.borderRadius="8px";let o=a.createDiv();o.style.display="flex",o.style.alignItems="center",o.style.gap="10px";let u=o.createEl("input");u.type="checkbox",u.checked=i.enabled,u.dataset.cardTypeEnabled=r,u.addEventListener("change",()=>this.saveCardTypeConfig(r,{enabled:u.checked}));let s=o.createEl("strong",{text:this.getCardTypeLabel(r)});s.style.fontSize="var(--font-ui-medium)";let c=a.createDiv();c.style.display="flex",c.style.flexWrap="wrap",c.style.alignItems="center",c.style.gap="10px 14px";let d=this.createInlineControlGroup(c,m("settings.cards.cardTypes.labels.headingLevel")),l=this.createSelect(d,`card-type-heading:${r}`);l.dataset.cardTypeHeading=r,l.style.width="88px";for(let k=1;k<=6;k+=1)this.appendOption(l,String(k),`H${k}`);l.value=String(i.headingLevel),l.addEventListener("change",()=>this.saveCardTypeConfig(r,{headingLevel:Number(l.value)}));let g=this.createInlineControlGroup(c,m("settings.cards.cardTypes.labels.extraMarker")).createEl("input");g.type="text",g.dataset.cardTypeMarker=r,g.placeholder=m("settings.cards.cardTypes.markerPlaceholder"),g.style.width="220px",g.value=this.getDraftValue(`card-type-marker:${r}`,i.extraMarker),g.addEventListener("input",()=>{this.scheduleDebouncedTextSave(`card-type-marker:${r}`,g.value,async k=>{await this.saveCardTypeConfig(r,{extraMarker:k})&&this.textDraftValues.delete(`card-type-marker:${r}`)})});let p=a.createDiv();p.style.display="grid",p.style.gridTemplateColumns="minmax(0, 1.1fr) minmax(0, 0.75fr) minmax(220px, 0.95fr)",p.style.alignItems="center",p.style.columnGap="16px",p.style.rowGap="8px",p.style.overflow="visible",p.style.width="100%";let M=this.createGridControlSlot(p,m("settings.cards.cardTypes.labels.noteType")),b=this.createSelect(M,`card-type-note-type:${r}`);b.dataset.cardTypeNoteType=r,this.applyFluidEllipsis(b);for(let k of this.getSelectableNoteModels(i.noteType))this.appendOption(b,k,k);b.value=i.noteType,b.disabled=this.ankiConfigLoading,b.addEventListener("change",()=>this.saveCardTypeConfig(r,{noteType:b.value})),this.renderCardTypeFieldControls(p,r)}renderCardTypeFieldControls(n,r){if(r==="qa-group"){this.renderQaGroupFieldControls(n,r);return}let i=this.getCurrentMappingForConfig(r);if(r==="cloze"){let d=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.mainField")),l=this.createFieldSelect(d,`card-type-question-field:${r}`),f=i&&"mainField"in i?i:void 0;l.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(l),this.populateFieldSelect(l,f?.loadedFieldNames??[],f?.mainField),l.addEventListener("change",()=>this.saveFieldMapping(r,{mainField:l.value||void 0}));return}let a=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.questionField")),o=this.createFieldSelect(a,`card-type-question-field:${r}`),u=i&&"bodyField"in i?i:void 0;o.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(o),this.populateFieldSelect(o,u?.loadedFieldNames??[],u?.titleField),o.addEventListener("change",()=>this.saveFieldMapping(r,{titleField:o.value||void 0}));let s=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.answerField")),c=this.createFieldSelect(s,`card-type-answer-field:${r}`);c.dataset.cardTypeAnswerField=r,this.applyFluidEllipsis(c),this.populateFieldSelect(c,u?.loadedFieldNames??[],u?.bodyField),c.addEventListener("change",()=>this.saveFieldMapping(r,{bodyField:c.value||void 0}))}renderQaGroupFieldControls(n,r){let i=this.plugin.settings.cardTypeConfigs[r].noteType.trim(),a=this.getQaGroupFieldState(r),o=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.qaGroupTitleField"));if(a.mapping){let f=this.createFieldSelect(o,`card-type-qa-group-title-field:${r}`);f.dataset.qaGroupTitleField=r,this.applyFluidEllipsis(f),this.populateFieldSelect(f,a.mapping.loadedFieldNames,a.mapping.titleField),f.addEventListener("change",()=>this.saveFieldMapping(r,{titleField:f.value||void 0}))}else o.createEl("span",{text:i.length>0?m("settings.cards.cardTypes.qaGroup.unavailable"):m("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupTitleField=r;let s=this.createGridControlSlot(n,m("settings.cards.cardTypes.labels.qaGroupSlotFields")).createEl("span",{text:a.mapping?m("settings.cards.cardTypes.qaGroup.detectedSlots",{count:a.mapping.slots.length}):i.length>0?m("settings.cards.cardTypes.qaGroup.unavailable"):m("settings.cards.cardTypes.qaGroup.noModel")});if(s.dataset.qaGroupSlotSummary=r,this.applyFluidEllipsis(s),a.error){let f=n.createDiv({text:Te(a.error)});f.dataset.qaGroupError=r,f.style.gridColumn="1 / -1";return}if(!a.mapping||a.mapping.warnings.length===0)return;let c=n.createDiv();c.dataset.qaGroupWarnings=r,c.style.gridColumn="1 / -1",c.style.display="flex",c.style.flexDirection="column",c.style.gap="6px",c.createEl("strong",{text:m("settings.cards.cardTypes.labels.qaGroupWarnings")});for(let f of a.mapping.warnings)c.createEl("div",{text:this.renderQaGroupWarning(f)}).dataset.qaGroupWarning=r;let d=c.createEl("label");d.style.display="inline-flex",d.style.alignItems="center",d.style.gap="8px";let l=d.createEl("input");l.type="checkbox",l.checked=ut(a.mapping.warnings,a.mapping.acceptedWarnings),l.dataset.qaGroupWarningAccept=r,l.addEventListener("change",()=>this.saveQaGroupWarningAcceptance(r,l.checked)),d.createEl("span",{text:m("settings.cards.cardTypes.qaGroup.acceptWarnings")})}renderSyncContentCard(n){let r=this.createSyncContentSection(n,"body-range",m("settings.cards.syncContent.sections.bodyRange"));new G.Setting(r).setName(m("settings.cardAnswerCutoffMode.name")).setDesc(m("settings.cardAnswerCutoffMode.desc")).addDropdown(u=>{u.addOption("heading-block",m("settings.cardAnswerCutoffMode.options.headingBlock")),u.addOption("double-blank-lines",m("settings.cardAnswerCutoffMode.options.doubleBlankLines")),u.setValue(this.plugin.settings.cardAnswerCutoffMode).onChange(s=>{this.plugin.updateSettings({cardAnswerCutoffMode:s})})});let i=this.createSyncContentSection(n,"backlink",m("settings.cards.syncContent.sections.backlink"));new G.Setting(i).setName(m("settings.syncOptions.addObsidianBacklink.name")).setDesc(m("settings.syncOptions.addObsidianBacklink.desc")).addToggle(u=>{u.setValue(this.plugin.settings.addObsidianBacklink).onChange(s=>{this.plugin.updateSettings({addObsidianBacklink:s})})}),new G.Setting(i).setName(m("settings.syncOptions.obsidianBacklinkLabel.name")).setDesc(m("settings.syncOptions.obsidianBacklinkLabel.desc")).addText(u=>{u.setPlaceholder(m("settings.syncOptions.obsidianBacklinkLabel.placeholder")).setValue(this.getDraftValue("obsidian-backlink-label",this.plugin.settings.obsidianBacklinkLabel)).onChange(s=>{this.scheduleDebouncedTextSave("obsidian-backlink-label",s,async c=>{let d=c.trim();await this.plugin.updateSettings({obsidianBacklinkLabel:d||Qe}),this.textDraftValues.delete("obsidian-backlink-label")})})}),new G.Setting(i).setName(m("settings.syncOptions.obsidianBacklinkPlacement.name")).setDesc(m("settings.syncOptions.obsidianBacklinkPlacement.desc")).addDropdown(u=>{u.addOption("question-last-line",m("settings.syncOptions.obsidianBacklinkPlacement.options.questionLastLine")),u.addOption("answer-first-line",m("settings.syncOptions.obsidianBacklinkPlacement.options.answerFirstLine")),u.addOption("answer-last-line",m("settings.syncOptions.obsidianBacklinkPlacement.options.answerLastLine")),u.setValue(this.plugin.settings.obsidianBacklinkPlacement).onChange(s=>{this.plugin.updateSettings({obsidianBacklinkPlacement:s})})});let a=this.createSyncContentSection(n,"tags",m("settings.cards.syncContent.sections.tags"));new G.Setting(a).setName(m("settings.syncOptions.syncObsidianTagsToAnki.name")).setDesc(m("settings.syncOptions.syncObsidianTagsToAnki.desc")).addToggle(u=>{u.setValue(this.plugin.settings.syncObsidianTagsToAnki).onChange(s=>{this.plugin.updateSettings({syncObsidianTagsToAnki:s})})}),new G.Setting(a).setName(m("settings.syncOptions.keepPureTagLinesInCardBody.name")).setDesc(m("settings.syncOptions.keepPureTagLinesInCardBody.desc")).addToggle(u=>{u.setValue(this.plugin.settings.keepPureTagLinesInCardBody).onChange(s=>{this.plugin.updateSettings({keepPureTagLinesInCardBody:s})})});let o=this.createSyncContentSection(n,"cloze-special",m("settings.cards.syncContent.sections.clozeSpecial"));new G.Setting(o).setName(m("settings.syncOptions.highlightsToCloze.name")).setDesc(m("settings.syncOptions.highlightsToCloze.desc")).addToggle(u=>{u.setValue(this.plugin.settings.convertHighlightsToCloze).onChange(s=>{this.plugin.updateSettings({convertHighlightsToCloze:s})})})}createSyncContentSection(n,r,i){let a=n.createDiv();a.dataset.syncContentSection=r,a.style.display="flex",a.style.flexDirection="column",a.style.gap="8px",a.style.marginTop="16px";let o=a.createEl("h4",{text:i});return o.dataset.syncContentSectionTitle=r,o.style.margin="0",a}renderScopeCard(n){if(new G.Setting(n).setName(m("settings.scope.name")).setDesc(_u(this.plugin.settings.scopeMode)).addDropdown(s=>{s.addOption("all",m("settings.scope.option.all")).addOption("include",m("settings.scope.option.include")).addOption("exclude",m("settings.scope.option.exclude")).setValue(this.plugin.settings.scopeMode).onChange(c=>{c!=="all"&&c!=="include"&&c!=="exclude"||this.updateScopeMode(c)})}),this.plugin.settings.scopeMode==="all")return;let i=n.createDiv().createEl("button",{text:m("settings.cards.scope.refreshFolders")});if(i.type="button",i.dataset.scopeRefreshFolders="true",i.disabled=!!this.folderTreeLoadPromise,i.addEventListener("click",()=>{this.refreshFolderTree()}),this.ensureFolderTreeLoaded(),n.createEl("p",{text:Nu(this.plugin.settings.scopeMode)}),this.folderTreeLoadPromise||this.folderTree.length===0){n.createEl("p",{text:Te(this.folderTreeStatus)});return}this.expandSelectedFolderAncestorsIfNeeded(this.plugin.settings.scopeMode);let a=this.getSelectedFoldersForScopeMode(this.plugin.settings.scopeMode),o=Di(this.folderTree,a),u=n.createDiv();u.dataset.scopeTree="true",u.style.display="flex",u.style.flexDirection="column",u.style.gap="2px";for(let s of o)this.renderFolderNode(u,s,this.plugin.settings.scopeMode,0)}renderDeckCard(n){let r=this.createDeckSection(n,"folder-mapping",m("settings.cards.deck.sections.folderMapping"));new G.Setting(r).setName(m("settings.deck.folderDeckMode.name")).setDesc(m("settings.deck.folderDeckMode.desc")).addDropdown(o=>{this.populateFolderDeckModeDropdown(o,this.plugin.settings.folderDeckMode),o.onChange(u=>{u!=="off"&&u!=="folder"&&u!=="folder-and-file"||this.plugin.updateSettings({folderDeckMode:u})})}),this.renderDeckExampleBlock(r);let i=this.createDeckSection(n,"file-deck",m("settings.cards.deck.sections.fileDeck"));new G.Setting(i).setName(m("settings.deck.fileDeckEnabled.name")).setDesc(m("settings.deck.fileDeckEnabled.desc")).addToggle(o=>{o.setValue(this.plugin.settings.fileDeckEnabled).onChange(async u=>{await this.plugin.updateSettings({fileDeckEnabled:u}),this.renderCard("deck")})}),this.plugin.settings.fileDeckEnabled&&(new G.Setting(i).setName(m("settings.deck.marker.name")).setDesc(m("settings.deck.marker.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-marker",this.plugin.settings.fileDeckMarker)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-marker",u,async s=>{let c=s.trim();if(!c){this.textDraftValues.delete("file-deck-marker"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckMarker:c}),this.textDraftValues.delete("file-deck-marker")})})}),new G.Setting(i).setName(m("settings.deck.template.name")).setDesc(m("settings.deck.template.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-template",this.plugin.settings.fileDeckTemplate)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-template",u,async s=>{let c=s.trim();if(!c){this.textDraftValues.delete("file-deck-template"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckTemplate:c}),this.textDraftValues.delete("file-deck-template")})})}),new G.Setting(i).setName(m("settings.deck.insertLocation.name")).setDesc(m("settings.deck.insertLocation.desc")).addDropdown(o=>{this.populateFileDeckInsertLocationDropdown(o,this.plugin.settings.fileDeckInsertLocation),o.onChange(u=>{u!=="yaml"&&u!=="body"||this.plugin.updateSettings({fileDeckInsertLocation:u})})}),new G.Setting(i).setName(m("settings.deck.insertTemplate.name")).setDesc(m("settings.deck.insertTemplate.desc")).addButton(o=>{o.setButtonText(m("settings.deck.insertTemplate.button")).onClick(()=>{this.plugin.insertDeckTemplateToCurrentFile()})}));let a=this.createDeckSection(n,"default-deck",m("settings.cards.deck.sections.defaultDeck"));new G.Setting(a).setName(m("settings.deck.defaultDeck.name")).setDesc(m("settings.deck.defaultDeck.desc")).addText(o=>{o.setValue(this.getDraftValue("default-deck",this.plugin.settings.defaultDeck)).onChange(u=>{this.scheduleDebouncedTextSave("default-deck",u,async s=>{let c=s.trim();if(!c){this.textDraftValues.delete("default-deck"),this.renderCard("deck");return}await this.plugin.updateSettings({defaultDeck:c}),this.textDraftValues.delete("default-deck")})})}),this.createDeckHelperText(a,m("settings.deck.fallbackDesc"),"fallback"),this.createDeckPriorityFooter(n)}renderDeckExampleBlock(n){let r=n.createDiv();r.dataset.deckExampleBlock="true",r.style.display="flex",r.style.flexDirection="column",r.style.gap="4px",r.style.marginTop="2px",r.style.marginLeft=qi;let i=r.createEl("strong",{text:m("settings.deck.examplesTitle")});i.style.fontSize="var(--font-ui-small)";for(let a of[m("settings.deck.folderExample"),m("settings.deck.folderAndFileExample")]){let o=r.createDiv({text:a});o.dataset.deckExampleRow="true",o.style.color="var(--text-muted)",o.style.fontSize="var(--font-ui-small)",o.style.lineHeight="1.4"}}createDeckHelperText(n,r,i){let a=n.createDiv({text:r});return a.dataset.deckHelperText=i,a.style.color="var(--text-muted)",a.style.fontSize="var(--font-ui-small)",a.style.lineHeight="1.4",a.style.marginTop="2px",a.style.marginLeft=qi,a}createDeckPriorityFooter(n){let r=this.createDeckHelperText(n,m("settings.deck.priorityDesc"),"priority");r.dataset.deckPriorityFooter="true",r.style.marginTop="12px"}createDeckSection(n,r,i){let a=n.createDiv();a.dataset.deckSection=r,a.style.display="flex",a.style.flexDirection="column",a.style.gap="8px",a.style.marginTop="16px";let o=a.createEl("h4",{text:i});return o.dataset.deckSectionTitle=r,o.style.margin="0",a}renderCommandsCard(n){n.createEl("p",{text:m("settings.cards.commands.desc")});let r=n.createEl("ul");for(let[i,a]of[[m("commands.syncCurrentFileToAnki"),m("settings.cards.commands.items.syncCurrentFile")],[m("commands.syncVaultToAnki"),m("settings.cards.commands.items.syncVault")],[m("commands.clearCurrentFileSyncedCards"),m("settings.cards.commands.items.clearCurrentFile")],[m("commands.cleanupEmptyDecks"),m("settings.cards.commands.items.cleanupDecks")]])r.createEl("li",{text:`${i}: ${a}`})}async saveCardTypeConfig(n,r){let i={...this.plugin.settings.cardTypeConfigs,[n]:{...this.plugin.settings.cardTypeConfigs[n],...r}};try{oe(ke({...this.plugin.settings,cardTypeConfigs:i}))}catch(a){return this.cardTypeStatusOverride=Ae(a,"settings.cards.cardTypes.failedSave"),this.renderCard("card-types"),!1}if(this.cardTypeStatusOverride=null,await this.plugin.updateSettings({cardTypeConfigs:i}),n==="qa-group"&&typeof r.noteType=="string"){await this.syncQaGroupMappingFromCache(i[n].noteType);let a=L("qa-group",i[n].noteType);if(!this.plugin.settings.noteFieldMappings[a]){let o=this.plugin.settings.ankiModelFieldCache[i[n].noteType];if(o){let u=this.qaGroupFieldMappingService.suggest(i[n].noteType,o.fieldNames,o.loadedAt);await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[a]:u}})}}}return this.renderCard("card-types"),!0}async saveFieldMapping(n,r){let i=this.getCurrentMappingForConfig(n),a=this.getRuntimeCardType(n),o=this.plugin.settings.cardTypeConfigs[n].noteType,u=L(a,o),s={...i??this.createFallbackMapping(a,o),...r};this.cardTypeStatusOverride=null,this.draftMappings[u]=s,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[u]:{...s,loadedFieldNames:[...s.loadedFieldNames]}}}),this.renderCard("card-types")}async loadAnkiCardTypeConfig(){this.noteTypeCacheCheckToken+=1,this.noteTypeCacheCheckPromise=null,this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus=this.resolveManualRefreshCacheStatus(),this.ankiConfigLoading=!0,this.renderCard("card-types");try{let n=await this.plugin.listNoteModels(),r=Hi(n);this.availableNoteModels.splice(0,this.availableNoteModels.length,...r);let i=await this.plugin.getModelFieldNamesByModelNames(r),a=Date.now(),o=Object.entries(i).reduce((s,[c,d])=>(s[c]={fieldNames:[...d],loadedAt:a},s),{});await this.plugin.updateSettings({ankiNoteTypeCache:this.getAvailableNoteModels(),ankiModelFieldCache:o}),this.hydrateVisibleCardTypeCaches(o),await this.syncQaGroupMappingFromCache(this.plugin.settings.cardTypeConfigs["qa-group"].noteType,o);let u=this.countConfiguredCardTypes(o);this.detectedAnkiNoteTypeCache=[...r],this.noteTypeCacheCheckStatus="same",this.cardTypeStatusOverride={key:"settings.cards.cardTypes.loadedSummary",params:{noteTypeCount:this.availableNoteModels.length,configuredCount:u}}}catch(n){this.cardTypeStatusOverride=Ae(n,"settings.cards.cardTypes.failedLoad")}finally{this.ankiConfigLoading=!1,this.renderCard("card-types")}}maybeStartNoteTypeCacheCheck(){if(this.ankiConfigLoading||this.plugin.settings.ankiNoteTypeCache.length===0||this.noteTypeCacheCheckStatus!=="idle"||this.noteTypeCacheCheckPromise)return;this.noteTypeCacheCheckStatus="checking";let n=++this.noteTypeCacheCheckToken,r=this.checkNoteTypeCacheFreshness(n).finally(()=>{this.noteTypeCacheCheckPromise===r&&(this.noteTypeCacheCheckPromise=null),n===this.noteTypeCacheCheckToken&&this.renderCard("card-types")});this.noteTypeCacheCheckPromise=r}async checkNoteTypeCacheFreshness(n){try{let r=Hi(await this.plugin.listNoteModels());if(n!==this.noteTypeCacheCheckToken)return;this.detectedAnkiNoteTypeCache=r,this.noteTypeCacheCheckStatus=Lu(this.plugin.settings.ankiNoteTypeCache,r)?"same":"changed"}catch{if(n!==this.noteTypeCacheCheckToken)return;this.noteTypeCacheCheckStatus="failed"}}getCardTypeStatusMessage(){if(this.ankiConfigLoading)return{key:"settings.cards.cardTypes.loadAnki.loading"};if(this.cardTypeStatusOverride)return this.cardTypeStatusOverride;let n=this.plugin.settings.ankiNoteTypeCache.length;if(n===0)return{key:"settings.cards.cardTypes.cacheEmpty"};let r=this.countConfiguredCardTypes(this.plugin.settings.ankiModelFieldCache);return this.noteTypeCacheCheckStatus==="changed"?{key:"settings.cards.cardTypes.cacheChanged",params:{cachedCount:n,liveCount:this.detectedAnkiNoteTypeCache?.length??n,configuredCount:r}}:this.noteTypeCacheCheckStatus==="failed"?{key:"settings.cards.cardTypes.cacheCheckFailed",params:{noteTypeCount:n,configuredCount:r}}:{key:"settings.cards.cardTypes.cacheSummary",params:{noteTypeCount:n,configuredCount:r}}}resolveManualRefreshCacheStatus(){return this.noteTypeCacheCheckStatus==="changed"||this.noteTypeCacheCheckStatus==="failed"?this.noteTypeCacheCheckStatus:this.plugin.settings.ankiNoteTypeCache.length>0?"same":"idle"}hydrateVisibleCardTypeCaches(n=this.plugin.settings.ankiModelFieldCache){for(let r of In)this.hydrateCardTypeCache(r,n)}hydrateCardTypeCache(n,r){let i=this.getRuntimeCardType(n),a=this.plugin.settings.cardTypeConfigs[n].noteType,o=L(i,a),u=r[a];if(!u)return;let s=this.createCachedModelDetails(a,u.fieldNames);this.loadedModelDetails[o]=s,this.seedDraftMapping(i,a,s,u.loadedAt)}createCachedModelDetails(n,r){return{fieldNames:[...r],isCloze:n.toLowerCase().includes("cloze")}}countConfiguredCardTypes(n){return In.reduce((r,i)=>{let a=this.plugin.settings.cardTypeConfigs[i];return a.enabled?r+(n[a.noteType]?1:0):r},0)}seedDraftMapping(n,r,i,a=Date.now()){let o=L(n,r),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];if(n==="qa-group"){try{this.draftMappings[o]=this.qaGroupFieldMappingService.suggest(r,i.fieldNames,a,B(u)?u.acceptedWarnings:void 0,B(u)?u.titleField:void 0)}catch{delete this.draftMappings[o]}return}if(u){this.draftMappings[o]={...u,loadedFieldNames:[...i.fieldNames],loadedAt:a};return}this.draftMappings[o]=this.noteFieldMappingService.suggest(n,r,i.fieldNames,a)}getSelectableNoteModels(n){let r=this.availableNoteModels.length>0?this.getAvailableNoteModels():[...this.plugin.settings.ankiNoteTypeCache];return r.includes(n)||r.unshift(n),r}getAvailableNoteModels(){return[...this.availableNoteModels]}getCurrentMappingForConfig(n){let r=this.getRuntimeCardType(n),i=this.plugin.settings.cardTypeConfigs[n].noteType,a=L(r,i),o=this.draftMappings[a]??this.plugin.settings.noteFieldMappings[a];if(o)return{...o,loadedFieldNames:[...o.loadedFieldNames]};let u=this.loadedModelDetails[a];if(!u)return;if(r==="qa-group")try{let c=this.plugin.settings.noteFieldMappings[a]??this.draftMappings[a],d=this.qaGroupFieldMappingService.suggest(i,u.fieldNames,Date.now(),B(c)?c.acceptedWarnings:void 0,B(c)?c.titleField:void 0);return this.draftMappings[a]=d,{...d,loadedFieldNames:[...d.loadedFieldNames],slots:d.slots.map(l=>({...l})),warnings:[...d.warnings],acceptedWarnings:d.acceptedWarnings?[...d.acceptedWarnings]:void 0}}catch{return}let s=this.noteFieldMappingService.suggest(r,i,u.fieldNames);return this.draftMappings[a]=s,{...s,loadedFieldNames:[...s.loadedFieldNames]}}createFallbackMapping(n,r){let i=L(n,r),a=this.loadedModelDetails[i];if(a){if(n==="qa-group"){let o=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return this.qaGroupFieldMappingService.suggest(r,a.fieldNames,Date.now(),B(o)?o.acceptedWarnings:void 0,B(o)?o.titleField:void 0)}return this.noteFieldMappingService.suggest(n,r,a.fieldNames)}return n==="qa-group"?{cardType:n,modelName:r,titleField:void 0,slots:[],warnings:[],acceptedWarnings:void 0,loadedFieldNames:[],loadedAt:Date.now()}:{cardType:n,modelName:r,loadedFieldNames:[],loadedAt:Date.now()}}async saveQaGroupWarningAcceptance(n,r){let i=this.getCurrentMappingForConfig(n);if(!i||!B(i))return;let a=this.getRuntimeCardType(n),o=L(a,i.modelName),u={...i,slots:i.slots.map(s=>({...s})),warnings:[...i.warnings],acceptedWarnings:r?[...i.warnings]:void 0,loadedFieldNames:[...i.loadedFieldNames]};this.cardTypeStatusOverride=null,this.draftMappings[o]=u,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:u}}),this.renderCard("card-types")}async syncQaGroupMappingFromCache(n,r=this.plugin.settings.ankiModelFieldCache){let i=n.trim();if(i.length===0)return;let a=r[i];if(!a)return;let o=L("qa-group",i),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];try{let s=this.qaGroupFieldMappingService.suggest(i,a.fieldNames,a.loadedAt,B(u)?u.acceptedWarnings:void 0,B(u)?u.titleField:void 0);this.draftMappings[o]=s,Iu(this.plugin.settings.noteFieldMappings[o],s)||await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:s}})}catch{if(delete this.draftMappings[o],this.plugin.settings.noteFieldMappings[o]){let s={...this.plugin.settings.noteFieldMappings};delete s[o],await this.plugin.updateSettings({noteFieldMappings:s})}}}getQaGroupFieldState(n){let r=this.plugin.settings.cardTypeConfigs[n].noteType,i=L("qa-group",r),a=this.draftMappings[i]??this.plugin.settings.noteFieldMappings[i];if(a&&B(a))return{mapping:{...a,loadedFieldNames:[...a.loadedFieldNames],slots:a.slots.map(u=>({...u})),warnings:[...a.warnings],acceptedWarnings:a.acceptedWarnings?[...a.acceptedWarnings]:void 0}};let o=this.loadedModelDetails[i];if(!o)return{};try{let u=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return{mapping:this.qaGroupFieldMappingService.suggest(r,o.fieldNames,Date.now(),B(u)?u.acceptedWarnings:void 0,B(u)?u.titleField:void 0)}}catch(u){return{error:Ae(u,"settings.cards.cardTypes.failedSave")}}}renderQaGroupWarning(n){let r=Jr(n);if(!r)return n;let i=String(r.index).padStart(2,"0");return r.kind==="missing-answer"?m("settings.cards.cardTypes.qaGroup.warning.missingAnswer",{index:i,questionField:r.questionField,answerField:r.answerField}):m("settings.cards.cardTypes.qaGroup.warning.missingQuestion",{index:i,questionField:r.questionField,answerField:r.answerField})}getRuntimeCardType(n){return n==="qa-group"?"qa-group":n==="cloze"?"cloze":n==="semantic-qa"?"semantic-qa":"basic"}ensureFolderTreeLoaded(n=!1){n&&(this.hasLoadedFolderTree=!1,this.folderTree=[]),!(this.hasLoadedFolderTree||this.folderTreeLoadPromise)&&(this.folderTreeStatus=Pi,this.folderTreeLoadPromise=this.plugin.listFolderTree().then(r=>{this.folderTree=r,this.folderTreeStatus=r.length>0?{rawMessage:""}:{key:"settings.scope.empty"},this.requestSelectedFolderAncestorExpansion()}).catch(r=>{this.folderTree=[],this.folderTreeStatus=Ae(r,"settings.scope.failedLoad")}).finally(()=>{this.hasLoadedFolderTree=!0,this.folderTreeLoadPromise=null,this.renderCard("scope")}))}async refreshFolderTree(){this.expandedFolderPaths.clear(),this.ensureFolderTreeLoaded(!0),this.renderCard("scope")}async updateScopeMode(n){await this.plugin.updateSettings({scopeMode:n}),n!=="all"&&(this.requestSelectedFolderAncestorExpansion(),this.ensureFolderTreeLoaded()),this.renderCard("scope")}async updateFolderSelection(n,r,i){let a=n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders,o=Ei(this.folderTree,a,r,i);await this.plugin.updateSettings(n==="include"?{includeFolders:o}:{excludeFolders:o}),this.renderCard("scope")}renderFolderNode(n,r,i,a){let o=n.createDiv();o.dataset.folderRow=r.path,o.style.display="grid",o.style.gridTemplateColumns="24px 24px minmax(0, 1fr)",o.style.alignItems="center",o.style.columnGap="0px",o.style.minHeight="28px",o.style.marginLeft=`${a*18}px`,o.style.width="100%",o.style.boxSizing="border-box";let u=r.children.length>0,s=u&&this.expandedFolderPaths.has(r.path),c=o.createEl(u?"button":"span");c.dataset.folderToggle=r.path,c.textContent=u?s?"\u25BE":"\u25B8":"",c.style.width="24px",c.style.height="24px",c.style.display="inline-flex",c.style.alignItems="center",c.style.justifyContent="center",c.style.padding="0",c.style.margin="0",c.style.border="0",c.style.background="transparent",c.style.boxShadow="none",c.style.fontSize="2em",c.style.lineHeight="1",c.style.color="var(--text-muted)",u&&(c.setAttr("aria-label",s?m("settings.scope.collapseFolder",{name:r.name}):m("settings.scope.expandFolder",{name:r.name})),c.setAttr("title",s?m("settings.scope.collapseFolder",{name:r.name}):m("settings.scope.expandFolder",{name:r.name})),c.style.cursor="pointer",c.addEventListener("click",()=>{this.expandedFolderPaths.has(r.path)?this.expandedFolderPaths.delete(r.path):this.expandedFolderPaths.add(r.path),this.renderCard("scope")}));let d=o.createEl("input");d.type="checkbox",d.checked=r.checked,d.indeterminate=r.indeterminate,d.dataset.folderPath=r.path,d.style.margin="0",d.style.justifySelf="center",d.addEventListener("change",()=>{this.updateFolderSelection(i,r.path,d.checked)});let l=o.createEl("span",{text:r.name});if(l.dataset.folderPathLabel=r.path,l.style.minWidth="0",l.style.overflow="hidden",l.style.textOverflow="ellipsis",l.style.whiteSpace="nowrap",!u||!s)return;let f=n.createDiv();f.dataset.folderChildren=r.path,f.style.display="flex",f.style.flexDirection="column",f.style.gap="2px";for(let g of r.children)this.renderFolderNode(f,g,i,a+1)}requestSelectedFolderAncestorExpansion(){this.scopeNeedsSelectedAncestorExpansion=!0}expandSelectedFolderAncestorsIfNeeded(n){if(this.scopeNeedsSelectedAncestorExpansion){this.scopeNeedsSelectedAncestorExpansion=!1;for(let r of this.getSelectedFoldersForScopeMode(n))for(let i of Pu(r))this.expandedFolderPaths.add(i)}}getSelectedFoldersForScopeMode(n){return n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders}createInlineControlGroup(n,r){let i=n.createEl("label");i.style.display="inline-flex",i.style.alignItems="center",i.style.gap="6px",i.style.flexWrap="nowrap";let a=i.createEl("span",{text:r});return a.style.whiteSpace="nowrap",i}createGridControlSlot(n,r){let i=n.createEl("label");i.style.display="flex",i.style.alignItems="center",i.style.gap="8px",i.style.minWidth="0",i.style.overflow="visible";let a=i.createEl("span",{text:r});a.style.whiteSpace="nowrap",a.style.flex="0 0 auto";let o=i.createDiv();return o.style.flex="1 1 0",o.style.minWidth="0",o.style.overflow="visible",o}applyFluidEllipsis(n){let r=(n.tagName||n.tag||"").toLowerCase(),i=r==="select"||r==="input";n.style.boxSizing="border-box",n.style.width=i?"calc(100% - 2px)":"100%",n.style.maxWidth=i?"calc(100% - 2px)":"100%",n.style.minWidth="0",n.style.margin=i?"1px":"0",n.style.overflow=i?"visible":"hidden",n.style.textOverflow="ellipsis",n.style.whiteSpace="nowrap"}scheduleDebouncedTextSave(n,r,i){this.textDraftValues.set(n,r);let a=this.debouncedTextSaves.get(n);a&&globalThis.clearTimeout(a);let o=globalThis.setTimeout(()=>{i(this.textDraftValues.get(n)??r).finally(()=>{this.debouncedTextSaves.delete(n)})},vu);this.debouncedTextSaves.set(n,o)}clearDebouncedTextSaves(){for(let n of this.debouncedTextSaves.values())globalThis.clearTimeout(n);this.debouncedTextSaves.clear()}getDraftValue(n,r){return this.textDraftValues.get(n)??r}createSelect(n,r){let i=n.createEl("select");return i.dataset.selectKey=r,i}createFieldSelect(n,r){return this.createSelect(n,r)}appendOption(n,r,i){let a=n.createEl("option",{text:i});a.value=r}populateFieldSelect(n,r,i){n.empty(),this.appendOption(n,"",r.length>0?m("settings.mapping.selectFieldPlaceholder"):m("settings.cards.cardTypes.fieldsUnavailable"));for(let a of r)this.appendOption(n,a,a);n.value=i??""}populateFileDeckInsertLocationDropdown(n,r){n.addOption("body",m("settings.deck.insertLocation.options.body")),n.addOption("yaml",m("settings.deck.insertLocation.options.yaml")),n.setValue(r)}populateFolderDeckModeDropdown(n,r){n.addOption("off",m("settings.deck.folderDeckMode.options.off")),n.addOption("folder",m("settings.deck.folderDeckMode.options.folder")),n.addOption("folder-and-file",m("settings.deck.folderDeckMode.options.folderAndFile")),n.setValue(r)}getCardTitle(n){return n==="card-types"?m("settings.cards.cardTypes.title"):n==="sync-content"?m("settings.cards.syncContent.title"):n==="scope"?m("settings.cards.scope.title"):n==="deck"?m("settings.cards.deck.title"):m("settings.cards.commands.title")}getCardTypeLabel(n){return n==="basic"?m("settings.cards.cardTypes.rows.basic"):n==="qa-group"?m("settings.cards.cardTypes.rows.qaGroup"):n==="cloze"?m("settings.cards.cardTypes.rows.cloze"):m("settings.cards.cardTypes.rows.semanticQa")}};function _u(e){return e==="include"?m("settings.scope.summary.include"):e==="exclude"?m("settings.scope.summary.exclude"):m("settings.scope.summary.all")}function Iu(e,t){return JSON.stringify(e)===JSON.stringify(t)}function Hi(e){let t=new Set;for(let n of e){if(typeof n!="string")continue;let r=n.trim();r.length>0&&t.add(r)}return[...t].sort((n,r)=>n.localeCompare(r))}function Lu(e,t){return e.length!==t.length?!1:e.every((n,r)=>n===t[r])}function Nu(e){return e==="include"?m("settings.scope.treeDescription.include"):m("settings.scope.treeDescription.exclude")}function Pu(e){let t=e.split("/").filter(r=>r.length>0),n=[];for(let r=1;r0?e.message.trim():String(e)}var Pt=class{async runCollectBatches(t,n,r,i){if(t.length===0)return[];let a=Gu(t,n),o=new Array(a.length),u=0;return await Promise.all(Array.from({length:Math.min(r,a.length)},async()=>{for(;u(await i(a),[]))}};function Gu(e,t){let n=[];for(let r=0;ri.has(a))}function je(e,t){let n=Rt(e),r=Rt(t),i=new Set(n),a=new Set(r);return{addTags:n.filter(o=>!a.has(o)),removeTags:r.filter(o=>!i.has(o))}}var Bt=class{constructor(t,n=new _e,r=new Pt){this.ankiGateway=t;this.noteFieldMappingService=n;this.batchScheduler=r}async execute(t,n,r,i){let a=new Map,o=new Map,u=new Set,s=new Map,c=0,d=0,l=0,f=0,g=Array.from(new Set([...t.toUpdate,...t.toVerifyDeck,...t.toRewriteMarker,...t.toChangeDeck].flatMap(y=>y.noteId?[y.noteId]:[]))),p=await this.batchScheduler.runCollectBatches(g,100,1,y=>this.ankiGateway.getNoteSummaries(y)),M=new Map(p.map(y=>[y.noteId,y])),b=[],k=[],S=[],x=[],h=new Set(t.toChangeDeck.map(y=>y.card.syncKey));for(let y of t.toCreate)b.push(await this.requireRenderedCard(y,n,r));for(let y of t.toUpdate){if(y.noteId&&M.has(y.noteId)){let T=await this.requireRenderedCard(y,n,r),D=M.get(y.noteId);D&&D.modelName!==T.noteModel?S.push({plannedCard:y,renderedCard:T,summary:D}):k.push({plannedCard:y,renderedCard:T});continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toRewriteMarker)if(!s.has(y.card.syncKey)){if(y.noteId&&M.has(y.noteId)){s.set(y.card.syncKey,y),o.set(y.card.syncKey,y.noteId);continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toVerifyDeck){if(!y.noteId)continue;let T=M.get(y.noteId);T&&qu(T,y.deck,h.has(y.card.syncKey))&&(x.push(y),o.set(y.card.syncKey,y.noteId))}await this.batchScheduler.runVoidBatches(Array.from(new Set([...b.map(y=>y.deck),...x.map(y=>y.deck)])),50,1,y=>this.ankiGateway.ensureDecks(y));let w=await this.uploadMedia([...b,...k.map(y=>y.renderedCard),...S.map(y=>y.renderedCard)]),F=await this.batchScheduler.runCollectBatches(b,50,1,async y=>this.ankiGateway.addNotes(await Promise.all(y.map(async T=>({deckName:T.deck,modelName:T.noteModel,fields:await this.mapFields(T,i,a),tags:T.card.tagsHint})))));for(let y=0;y{await this.ankiGateway.updateNotes(await Promise.all(y.map(async({plannedCard:T,renderedCard:D})=>({noteId:T.noteId??0,fields:await this.mapFields(D,i,a)}))))}),await this.batchScheduler.runVoidBatches(S,25,1,async y=>{for(let{plannedCard:T,renderedCard:D,summary:O}of y){let W=await this.mapFields(D,i,a);try{await this.ankiGateway.updateNoteModel({noteId:T.noteId??0,modelName:D.noteModel,fields:W})}catch(v){throw Nt({noteId:T.noteId??0,fromModel:O.modelName,toModel:D.noteModel,error:v,location:`${T.card.filePath}:${T.card.blockStartLine}`})}}});let _=[...k,...S].flatMap(({plannedCard:y})=>{if(!y.noteId)return[];let T=M.get(y.noteId);if(!T)return[];let D=je(y.card.tagsHint,T.tags);return D.addTags.length===0&&D.removeTags.length===0?[]:[{noteId:y.noteId,addTags:D.addTags,removeTags:D.removeTags}]});await this.batchScheduler.runVoidBatches(_,50,1,y=>this.ankiGateway.syncNoteTags(y)),d+=k.length+S.length,l=S.length;for(let{plannedCard:y}of[...k,...S])y.noteId&&(u.add(y.card.syncKey),o.set(y.card.syncKey,y.noteId));let A=new Map;for(let y of x){let T=y.noteId;if(!T)continue;let D=M.get(T);if(!D||D.cardIds.length===0)continue;let O=A.get(y.deck)??new Set;for(let W of D.cardIds)O.add(W);A.set(y.deck,O)}await this.batchScheduler.runVoidBatches(Array.from(A.entries()).map(([y,T])=>({deckName:y,cardIds:Array.from(T)})),25,1,y=>this.ankiGateway.changeDecks(y)),f=x.length;for(let y of x)u.add(y.card.syncKey);return{created:c,updated:d,migratedNoteTypes:l,migratedDecks:f,uploadedMedia:w,markerWrites:Array.from(s.values()).map(y=>({...y,noteId:o.get(y.card.syncKey)??y.noteId})),resolvedNoteIds:o,touchedSyncKeys:u}}async requireRenderedCard(t,n,r){let i=n.get(t.card.syncKey);if(i)return i;let a=await r(t);return n.set(t.card.syncKey,a),a}async mapFields(t,n,r){let i=await this.getModelDetails(t.noteModel,r);return this.noteFieldMappingService.mapRenderedCard({type:t.card.cardType,noteModel:t.noteModel,renderedFields:t.renderedFields},i,n)}async getModelDetails(t,n){let r=n.get(t);if(r)return r;let i=this.ankiGateway.getModelDetails(t).catch(a=>{throw n.delete(t),a});return n.set(t,i),i}async uploadMedia(t){let n=new Map;for(let r of t)for(let i of r.media)n.set(`${i.kind}:${i.absolutePath}:${i.fileName}`,i);return await this.batchScheduler.runVoidBatches(Array.from(n.values()),10,3,r=>this.ankiGateway.storeMediaFiles(r)),n.size}};function qu(e,t,n){let r=e.deckNames?.filter(i=>i.length>0)??[];return r.length===0?n:r.some(i=>i!==t)}var Le=class{filter(t,n,r,i){let a=Gt(r),o=Gt(i);return t.filter(u=>u.path.toLowerCase().endsWith(".md")?this.isPathInScope(u.path,n,a,o):!1)}isPathInScope(t,n,r,i){let a=zu(t),o=Gt(r),u=Gt(i);return n==="include"?o.some(s=>Qi(a,s)):n==="exclude"?!u.some(s=>Qi(a,s)):!0}};function Gt(e){return e.map(Hu).filter(Boolean)}function Hu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function zu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+/,"")}function Qi(e,t){return e===t||e.startsWith(`${t}/`)}function Ke(e,t,n){return`${e}\0${t}\0${n}`}function qt(e,t,n){return`${e}\0group\0${t}\0${n}`}function be(e,t){return`${e}#${t}`}function Ne(e){let t=Ou(e.lines,e.startLine,e.markerAdapter),n=t.find(o=>o.valid);if(n?.marker){let o=e.lines.slice(0,n.index);return{contentLines:o,trailingLines:Uu(e.lines.slice(n.index+1)),contentEndLine:Ht(o,e.startLine,e.fallbackLine),markerLine:e.startLine+n.index,markerIndent:n.indent,marker:n.marker,markerState:"present-valid"}}let r=e.cutoffMode==="double-blank-lines"?Wu(e.lines):void 0;if(r){let o=t.find(s=>!s.valid&&s.index>=r.end),u=e.lines.slice(0,r.start);return{contentLines:u,trailingLines:e.lines.slice(r.end),contentEndLine:Ht(u,e.startLine,e.fallbackLine),markerLine:o?e.startLine+o.index:void 0,markerIndent:o?.indent,markerState:o?"present-invalid":"missing"}}let i=$u(e.lines),a=i===void 0?void 0:t.find(o=>!o.valid&&o.index===i);if(a){let o=e.lines.filter((u,s)=>s!==a.index);return{contentLines:o,trailingLines:[],contentEndLine:Ht(o,e.startLine,e.fallbackLine),markerLine:e.startLine+a.index,markerIndent:a.indent,markerState:"present-invalid"}}return{contentLines:e.lines,trailingLines:[],contentEndLine:Ht(e.lines,e.startLine,e.fallbackLine),markerState:"missing"}}function Ou(e,t,n){let r=[],i=null;for(let a=0;a=2&&n!==void 0)return{start:n,end:i};t=t?null:a.slice(0,3),n=void 0,r=0;continue}if(!t){if(!a){n??(n=i),r+=1;continue}if(r>=2&&n!==void 0)return{start:n,end:i};n=void 0,r=0}}if(r>=2&&n!==void 0)return{start:n,end:e.length}}function Ht(e,t,n){for(let r=e.length-1;r>=0;r-=1)if(e[r].trim())return t+r;return n}function $u(e){for(let t=e.length-1;t>=0;t-=1)if(e[t].trim())return t}function Uu(e){let t=0;for(;t1&&a.push({filePath:r,code:"deck_multiple_body_declarations",params:{marker:i}}),{bodyDeck:o[0],warnings:a}}};function Vu(e){if(e[0]?.trim()==="---"){for(let t=1;t!as(s))),u=[`qa-group:${n}`,...a.map(s=>`${s.title} ${s.answer}`),...o].join(` `).trimEnd();return{stem:n,items:a,markerState:r.markerState,groupMarker:r.marker,contentEndLine:r.contentEndLine,markerLine:r.markerLine,markerIndent:r.markerIndent,rawBlockText:u,rawBlockHash:z(u)}}};function Ju(e,t){let n=e.trimEnd();return n.endsWith(t)?n.slice(0,n.length-t.length).trimEnd():n}function es(e){let t=[],n=null;for(let i=0;ii.indent.length));return t.filter(i=>i.indent.length===r)}function ts(e,t,n,r){let i,a=t-1,o=null;for(let u=t;ua.indent.length));return n.find(a=>a.indent.length===i)??null}function rs(e){let t=0,n=e.length;for(;tt&&!e[n-1].trim();)n-=1;return e.slice(t,n)}function is(e){return e.match(/^[ \t]*/)?.[0]??""}function Pn(e){return e.startsWith("```")||e.startsWith("~~~")}function as(e){return/^\s*