var S=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var N=(i,t)=>{for(var e in t)S(i,e,{get:t[e],enumerable:!0})},M=(i,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of k(t))!T.call(i,n)&&n!==e&&S(i,n,{get:()=>t[n],enumerable:!(a=R(t,n))||a.enumerable});return i};var C=i=>M(S({},"__esModule",{value:!0}),i);var A={};N(A,{default:()=>x});module.exports=C(A);var f=require("obsidian");var r=require("obsidian"),P={remarkableHost:"https://10.11.99.1",rmapiBinaryPath:"rmapi",downloadPath:"remarkable",convertToPdf:!0,enableHandwritingMd:!0,glmocrServerUrl:"http://100.103.83.12:5002",glmocrApiKey:"any-string",ollamaHost:"http://100.103.83.12:11435",styleModel:"qwen3:32b",pageRenderer:"drawj2d",javaPath:"java",syncInterval:0},p=class extends r.PluginSettingTab{plugin;constructor(t,e){super(t,e),this.plugin=e}display(){let{containerEl:t}=this;t.empty(),t.createEl("h2",{text:"reMarkable Sync Settings"}),new r.Setting(t).setName("reMarkable Host").setDesc("URL of your reMarkable tablet (e.g., https://10.11.99.1)").addText(e=>e.setValue(this.plugin.settings.remarkableHost).onChange(async a=>{this.plugin.settings.remarkableHost=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("rmapi Binary Path").setDesc("Path to rmapi binary (e.g., rmapi or /usr/local/bin/rmapi)").addText(e=>e.setValue(this.plugin.settings.rmapiBinaryPath).onChange(async a=>{this.plugin.settings.rmapiBinaryPath=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Download Path").setDesc("Folder in vault for downloaded documents").addText(e=>e.setValue(this.plugin.settings.downloadPath).onChange(async a=>{this.plugin.settings.downloadPath=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Convert to PDF").setDesc("Automatically convert documents to annotated PDF").addToggle(e=>e.setValue(this.plugin.settings.convertToPdf).onChange(async a=>{this.plugin.settings.convertToPdf=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Enable Handwriting to Markdown").setDesc("Convert handwritten notes to styled Markdown").addToggle(e=>e.setValue(this.plugin.settings.enableHandwritingMd).onChange(async a=>{this.plugin.settings.enableHandwritingMd=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("GLM-OCR Server URL").setDesc("URL of GLM-OCR SDK Server (e.g., http://100.103.83.12:5002)").addText(e=>e.setValue(this.plugin.settings.glmocrServerUrl).onChange(async a=>{this.plugin.settings.glmocrServerUrl=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("GLM-OCR API Key").setDesc("API key for GLM-OCR Server (can be any string for self-hosted)").addText(e=>e.setValue(this.plugin.settings.glmocrApiKey).onChange(async a=>{this.plugin.settings.glmocrApiKey=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Ollama Host").setDesc("URL of Ollama server for style refinement (e.g., http://100.103.83.12:11435)").addText(e=>e.setValue(this.plugin.settings.ollamaHost).onChange(async a=>{this.plugin.settings.ollamaHost=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Style Model").setDesc("Ollama model for Markdown style refinement").addText(e=>e.setValue(this.plugin.settings.styleModel).onChange(async a=>{this.plugin.settings.styleModel=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Page Renderer").setDesc("Tool to render .rm pages as PNG").addDropdown(e=>e.addOption("drawj2d","drawj2d (recommended)").addOption("rM2svg","rM2svg (lightweight)").setValue(this.plugin.settings.pageRenderer).onChange(async a=>{this.plugin.settings.pageRenderer=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Java Path").setDesc("Path to Java runtime (for drawj2d)").addText(e=>e.setValue(this.plugin.settings.javaPath).onChange(async a=>{this.plugin.settings.javaPath=a,await this.plugin.saveSettings()})),new r.Setting(t).setName("Sync Interval (minutes)").setDesc("0 = manual only, >0 = auto-sync every N minutes").addText(e=>{e.setValue(String(this.plugin.settings.syncInterval)).onChange(async a=>{let n=parseInt(a);this.plugin.settings.syncInterval=isNaN(n)||n<0?0:n,await this.plugin.saveSettings()}),e.inputEl.type="number",e.inputEl.min="0"})}};var b=require("child_process");async function D(i,t=[],e={},a){return new Promise(n=>{let s=(0,b.spawn)(i,t,{env:{...process.env,...e},cwd:a}),o="",l="",m=!1,u=(d,v)=>{m||(m=!0,n({stdout:o,stderr:v?`${l} ${v.message}`:l,code:d}))};s.stdout.on("data",d=>{o+=d.toString()}),s.stderr.on("data",d=>{l+=d.toString()}),s.on("error",d=>{u(1,d)}),s.on("close",d=>{u(d??0)})})}var c=class{plugin;constructor(t){this.plugin=t}getEnv(){return{RMAPI_HOST:this.plugin.settings.remarkableHost,RMAPI_CONFIG:this.plugin.app.vault.adapter.getBasePath()+"/.obsidian/rmapi"}}async runRmapi(t){return D(this.plugin.settings.rmapiBinaryPath,t,this.getEnv())}async list(t="/"){let{stdout:e,stderr:a,code:n}=await this.runRmapi(["ls","--json",t]);if(n!==0)throw new Error(`rmapi ls failed: ${a||e}`);try{return JSON.parse(e)}catch(s){throw new Error(`Failed to parse rmapi output: ${s}`)}}async downloadFile(t,e){let{stdout:a,stderr:n,code:s}=await this.runRmapi(["get",t,"-o",e]);if(s!==0)throw new Error(`rmapi get failed: ${n||a}`)}async downloadAnnotatedPdf(t,e){let{stdout:a,stderr:n,code:s}=await this.runRmapi(["geta",t,"-o",e]);if(s!==0)throw new Error(`rmapi geta failed: ${n||a}`)}async isAuthenticated(){let{code:t,stderr:e}=await this.runRmapi(["ls","--json","/"]);return t===0&&!e.includes("auth")&&!e.includes("register")}};var h=class{plugin;constructor(t){this.plugin=t}async loadSyncedDocuments(){return(await this.plugin.loadData()).syncedDocuments||[]}async saveSyncedDocuments(t){let e=await this.plugin.loadData()||{};await this.plugin.saveData({...e,syncedDocuments:t})}async trackDocument(t,e,a,n,s){let o=await this.loadSyncedDocuments(),l=o.findIndex(u=>u.id===t),m={id:t,name:e,lastSynced:new Date().toISOString(),localPath:a,hasPdf:n,hasMd:s};l>=0?o[l]=m:o.push(m),await this.saveSyncedDocuments(o)}async isDocumentSynced(t){return(await this.loadSyncedDocuments()).some(a=>a.id===t)}async getSyncedDocument(t){return(await this.loadSyncedDocuments()).find(a=>a.id===t)||null}};var y=require("obsidian");function I(i){return i.replace(/[\\/:*?"<>|]/g,"_")}var w=class{plugin;rmapi;tracker;constructor(t){this.plugin=t,this.rmapi=new c(t),this.tracker=new h(t)}async syncAll(){try{new y.Notice("Syncing from reMarkable...");let t=await this.listAllDocuments("/");for(let e of t)await this.downloadDocument(e);new y.Notice(`Sync completed! ${t.length} document(s) synced.`)}catch(t){new y.Notice(`Sync failed: ${t}`),console.error("Sync error:",t)}}async listAllDocuments(t){let e=await this.rmapi.list(t),a=e.filter(n=>n.type==="DocumentType");for(let n of e.filter(s=>s.type==="CollectionType")){let s=t==="/"?`/${n.name}`:`${t}/${n.name}`,o=await this.listAllDocuments(s);a=a.concat(o)}return a}async downloadDocument(t){let e=await this.tracker.getSyncedDocument(t.id);if(e&&e.lastSynced>=t.modifiedClient)return;let a=I(t.name),n=this.plugin.settings.downloadPath,s=`${n}/${a}`;try{await this.plugin.app.vault.adapter.mkdir(n)}catch(l){console.warn("mkdir failed (may already exist):",l)}await this.rmapi.downloadFile(t.name,s);let o=!1;if(this.plugin.settings.convertToPdf){let l=`${n}/${a}.pdf`;await this.rmapi.downloadAnnotatedPdf(t.name,l),o=!0}await this.tracker.trackDocument(t.id,t.name,s,o,!1)}};var g=class extends f.Plugin{settings;downloader;rmapi;statusBarItem;async onload(){await this.loadSettings(),this.rmapi=new c(this),this.downloader=new w(this),this.addRibbonIcon("pencil","Sync from reMarkable",()=>{this.performSync()}),this.addCommand({id:"sync-all",name:"Sync from reMarkable",callback:()=>this.performSync()}),this.addSettingTab(new p(this.app,this)),this.statusBarItem=this.addStatusBarItem(),this.updateStatusBar("Idle"),this.settings.syncInterval>0&&this.registerInterval(window.setInterval(()=>{this.performSync()},this.settings.syncInterval*60*1e3))}onunload(){}async performSync(){try{if(!await this.rmapi.isAuthenticated()){new f.Notice("reMarkable not authenticated. Run 'rmapi' in a terminal to pair your device.",1e4);return}this.updateStatusBar("Syncing..."),await this.downloader.syncAll(),this.updateStatusBar(`Last sync: ${new Date().toLocaleTimeString()}`)}catch(t){this.updateStatusBar("Sync failed"),console.error("Sync error:",t)}}updateStatusBar(t){this.statusBarItem.setText(`reMarkable: ${t}`)}async loadSettings(){this.settings=Object.assign({},P,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}};var x=g;