import fs from 'node:fs';import crypto from 'node:crypto'; const b='work/trilium',out=b+'/phase5';fs.mkdirSync(out,{recursive:true}); const hash=s=>crypto.createHash('sha256').update(s).digest('hex'); const pdf=fs.readFileSync('output/pdf/마지막-질문-한국어.pdf');fs.writeFileSync(out+'/demo-ko.pdf',pdf); const original=fs.readFileSync(b+'/phase4-inspect/demo.pdf'); let main=fs.readFileSync(b+'/phase4/main.cjs','utf8');const oldmain=main; const marker='triliumApplyKoreanPhase4()})';if(main.split(marker).length!==2)throw Error('Startup mismatch'); main=main.replace(marker,'triliumApplyKoreanPhase4();triliumApplyKoreanPdf()})'); const hook=` function triliumApplyKoreanPdf(){ const fs=require('fs'),crypto=require('crypto'),file='/home/node/trilium-data/korean-demo-pdf.pending'; if(!fs.existsSync(file))return; const content=fs.readFileSync(file),hash=s=>crypto.createHash('sha256').update(s).digest('hex'); if(hash(content)!=='${hash(pdf)}')throw Error('Invalid Korean PDF'); de.transactional(()=>{ const n=J.getNoteOrThrow('swKGGdlek7o6'),old=n.getContent(); if(n.isDeleted||n.isProtected||n.mime!=='application/pdf')throw Error('PDF note mismatch'); if(hash(old)===hash(content))return; if(hash(old)!=='${hash(original)}')throw Error('PDF content changed'); const rev=new Mk({noteId:n.noteId,title:n.title,type:n.type,mime:n.mime,isProtected:n.isProtected,utcDateLastEdited:n.utcDateModified,utcDateCreated:kr.utcNowDateTime(),utcDateModified:kr.utcNowDateTime(),dateLastEdited:n.dateModified,dateCreated:kr.localNowDateTime()},true); rev.save();rev.setContent(old);n.setContent(content); }); fs.renameSync(file,file+'.applied-'+Date.now());console.log('KOREAN_DEMO_PDF_APPLIED'); } `; fs.writeFileSync(out+'/main.cjs',hook+main); fs.writeFileSync(out+'/manifest.json',JSON.stringify({previousMainSha256:hash(oldmain),originalPdfSha256:hash(original),files:{'main.cjs':hash(hook+main),'demo-ko.pdf':hash(pdf)}},null,2)); console.log({pdfBytes:pdf.length});