/ releases / chrome-mv3 / chunks / options-BTtuK8X8.js
options-BTtuK8X8.js
 1  var Oa=Object.defineProperty;var za=(be,o,l)=>o in be?Oa(be,o,{enumerable:!0,configurable:!0,writable:!0,value:l}):be[o]=l;var Je=(be,o,l)=>za(be,typeof o!="symbol"?o+"":o,l);import{d as Ra,s as g,p as St,o as Ka,f,c as a,a as i,i as u,t as D,b as me,g as t,e as xt,h as r,j as Va,k as s,l as L,m as Ga,n as q,q as ja,r as oe,u as F,v as j,w as I,x as Ct,y as Wa}from"./global-imVxZN8Y.js";import{g as Ya,D as Ja,i as Qa,a as Xa,t as Tt,b as Qe,w as Za}from"./workspace-sync-C-pBiGKB.js";const $a={status:"disconnected",lastSyncTime:null,lastExternalMtime:null,error:null,configDir:null,hostVersion:null};new Date().toISOString();const ei="MnemonicSync",ye="handles",Mt="syncDirectory",pe="mnemonic-workspaces.json",ps="mnemonic-workspaces.backup.json";function Pt(){return"showDirectoryPicker"in window}class ti{constructor(){Je(this,"directoryHandle",null);Je(this,"state",{...$a});Je(this,"listeners",new Set);Je(this,"lastKnownMtime",0)}getState(){return{...this.state}}subscribe(o){return this.listeners.add(o),()=>this.listeners.delete(o)}notify(){const o=this.getState();for(const l of this.listeners)l(o)}updateState(o){this.state={...this.state,...o},this.notify()}async openDB(){return new Promise((o,l)=>{const M=indexedDB.open(ei,1);M.onerror=()=>l(M.error),M.onsuccess=()=>o(M.result),M.onupgradeneeded=P=>{const H=P.target.result;H.objectStoreNames.contains(ye)||H.createObjectStore(ye)}})}async storeHandle(o){const l=await this.openDB();return new Promise((M,P)=>{const H=l.transaction(ye,"readwrite"),he=H.objectStore(ye).put(o,Mt);he.onerror=()=>{l.close(),P(he.error)},he.onsuccess=()=>M(),H.oncomplete=()=>l.close(),H.onerror=()=>l.close(),H.onabort=()=>l.close()})}async retrieveHandle(){try{const o=await this.openDB();return new Promise((l,M)=>{const P=o.transaction(ye,"readonly"),X=P.objectStore(ye).get(Mt);X.onerror=()=>{o.close(),M(X.error)},X.onsuccess=()=>l(X.result||null),P.oncomplete=()=>o.close(),P.onerror=()=>o.close(),P.onabort=()=>o.close()})}catch{return null}}async clearHandle(){try{const o=await this.openDB();return new Promise((l,M)=>{const P=o.transaction(ye,"readwrite"),X=P.objectStore(ye).delete(Mt);X.onerror=()=>{o.close(),M(X.error)},X.onsuccess=()=>l(),P.oncomplete=()=>o.close(),P.onerror=()=>o.close(),P.onabort=()=>o.close()})}catch{}}async verifyPermission(o,l=!0){const M={mode:l?"readwrite":"read"};return await o.queryPermission(M)==="granted"||await o.requestPermission(M)==="granted"}async connect(){if(!Pt())return this.updateState({status:"error",error:"File System Access API not supported in this browser"}),!1;this.updateState({status:"connecting",error:null});try{const o=await this.retrieveHandle();return o&&await this.verifyPermission(o)?(this.directoryHandle=o,this.updateState({status:"connected",configDir:o.name}),console.log("[Mnemonic] Filesystem bridge connected to:",o.name),!0):(this.updateState({status:"disconnected",error:'No directory selected. Click "Select Directory" to choose a sync folder.'}),!1)}catch(o){const l=o instanceof Error?o.message:"Connection failed";return this.updateState({status:"error",error:l}),console.error("[Mnemonic] Filesystem bridge connection failed:",o),!1}}async selectDirectory(){if(!Pt())return this.updateState({status:"error",error:"File System Access API not supported in this browser"}),!1;try{const o=await window.showDirectoryPicker({id:"mnemonic-sync",mode:"readwrite",startIn:"documents"});return await this.storeHandle(o),this.directoryHandle=o,this.updateState({status:"connected",configDir:o.name,error:null}),console.log("[Mnemonic] Selected sync directory:",o.name),!0}catch(o){if(o instanceof Error&&o.name==="AbortError")return this.updateState({status:"disconnected",error:"Directory selection cancelled"}),!1;const l=o instanceof Error?o.message:"Failed to select directory";return this.updateState({status:"error",error:l}),!1}}async disconnect(){await this.clearHandle(),this.directoryHandle=null,this.updateState({status:"disconnected",error:null,configDir:null})}isConnected(){return this.directoryHandle!==null&&this.state.status==="connected"}async getInfo(){if(!this.directoryHandle)return{success:!1,error:"Not connected",exists:!1};try{const l=await(await this.directoryHandle.getFileHandle(pe,{create:!1})).getFile();return{success:!0,exists:!0,path:`${this.directoryHandle.name}/${pe}`,mtime:l.lastModified,size:l.size,directoryName:this.directoryHandle.name}}catch(o){return o instanceof Error&&o.name==="NotFoundError"?{success:!0,exists:!1,path:`${this.directoryHandle.name}/${pe}`,directoryName:this.directoryHandle.name}:{success:!1,error:o instanceof Error?o.message:"Failed to get file info",exists:!1}}}async read(){if(!this.directoryHandle)return{success:!1,error:"Not connected",exists:!1};try{const l=await(await this.directoryHandle.getFileHandle(pe,{create:!1})).getFile(),M=await l.text(),P=JSON.parse(M);return this.lastKnownMtime=l.lastModified,this.updateState({lastExternalMtime:l.lastModified}),{success:!0,data:P,exists:!0,mtime:l.lastModified}}catch(o){return o instanceof Error&&o.name==="NotFoundError"?{success:!0,exists:!1}:{success:!1,error:o instanceof Error?o.message:"Failed to read file",exists:!1}}}async write(o){if(!this.directoryHandle)return{success:!1,error:"Not connected"};this.updateState({status:"syncing"});try{await this.createBackup();const l=await this.directoryHandle.getFileHandle(pe,{create:!0}),M=await l.createWritable(),P=JSON.stringify(o,null,2);await M.write(P),await M.close();const H=await l.getFile();return this.lastKnownMtime=H.lastModified,this.updateState({status:"connected",lastSyncTime:new Date().toISOString(),lastExternalMtime:H.lastModified}),{success:!0,mtime:H.lastModified,path:`${this.directoryHandle.name}/${pe}`}}catch(l){const M=l instanceof Error?l.message:"Write failed";return this.updateState({status:"error",error:M}),{success:!1,error:M}}}async createBackup(){if(this.directoryHandle)try{const M=await(await(await this.directoryHandle.getFileHandle(pe,{create:!1})).getFile()).text(),H=await(await this.directoryHandle.getFileHandle(ps,{create:!0})).createWritable();await H.write(M),await H.close()}catch{}}async restore(){if(!this.directoryHandle)return{success:!1,error:"Not connected"};try{const M=await(await(await this.directoryHandle.getFileHandle(ps,{create:!1})).getFile()).text();JSON.parse(M);const P=await this.directoryHandle.getFileHandle(pe,{create:!0}),H=await P.createWritable();await H.write(M),await H.close();const X=await P.getFile();return this.lastKnownMtime=X.lastModified,this.updateState({lastExternalMtime:X.lastModified}),{success:!0}}catch(o){return o instanceof Error&&o.name==="NotFoundError"?{success:!1,error:"No backup file found"}:{success:!1,error:o instanceof Error?o.message:"Restore failed"}}}async delete(){if(!this.directoryHandle)return{success:!1,error:"Not connected"};try{return await this.directoryHandle.removeEntry(pe),{success:!0}}catch(o){return o instanceof Error&&o.name==="NotFoundError"?{success:!0}:{success:!1,error:o instanceof Error?o.message:"Delete failed"}}}async checkForChanges(){if(!this.directoryHandle)return!1;try{const o=await this.getInfo();if(!o.success||!o.exists)return!1;const l=o.mtime||0;return l>this.lastKnownMtime?(console.log("[Mnemonic] Filesystem external changes detected:",{external:l,lastKnown:this.lastKnownMtime}),!0):!1}catch{return!1}}async ping(){if(!this.directoryHandle)return{success:!1,error:"Not connected"};try{return await this.verifyPermission(this.directoryHandle)?{success:!0,directoryName:this.directoryHandle.name}:{success:!1,error:"Permission denied"}}catch(o){return{success:!1,error:o instanceof Error?o.message:"Ping failed"}}}}let Et=null;function si(){return Et||(Et=new ti),Et}const At=["*://*.youtube.com/*","*://youtube.com/*","*://*.music.youtube.com/*","*://*.invidious.io/*","*://*.invidious.snopyta.org/*","*://yewtu.be/*","*://invidio.us/*","*://inv.riverside.rocks/*","*://invidious.kavin.rocks/*","*://*.vimeo.com/*","*://*.twitch.tv/*","*://*.netflix.com/*","*://*.hulu.com/*","*://*.disneyplus.com/*","*://*.primevideo.com/*","*://*.hbomax.com/*","*://*.spotify.com/*","*://*.soundcloud.com/*","*://*.bandcamp.com/*","*://*.tidal.com/*","*://*.deezer.com/*","*://*.pandora.com/*"];var ai=f('<span class="status-badge status-active svelte-1i20b51">Connected</span>'),ii=f('<span class="status-badge status-inactive svelte-1i20b51">Not Connected</span>'),ni=f('<div class="filesystem-folder svelte-1i20b51"><span class="folder-label svelte-1i20b51">Sync folder:</span> <span class="folder-path svelte-1i20b51"> </span></div>'),ri=f('<p class="filesystem-error svelte-1i20b51"> </p>'),oi=f(`<div class="setting-item filesystem-config svelte-1i20b51"><div class="filesystem-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Status:</span> <!></div> <!> <div class="filesystem-actions svelte-1i20b51"><button type="button" class="btn-primary svelte-1i20b51"> </button></div> <!> <div class="filesystem-instructions svelte-1i20b51"><p class="setting-description svelte-1i20b51">Select a folder to store your workspace data. Use a cloud-synced folder
 2                (Dropbox, Google Drive, OneDrive) to sync across devices.</p> <p class="setting-description note svelte-1i20b51"><strong>Note:</strong> Permission is usually remembered. Re-granting may be needed if you clear browser data.</p></div></div>`),li=f('<span class="status-badge status-testing svelte-1i20b51">Testing...</span>'),ci=f('<span class="status-badge status-active svelte-1i20b51">Connected</span>'),vi=f('<span class="status-badge status-inactive svelte-1i20b51">Not Connected</span>'),di=f('<div class="native-info svelte-1i20b51"><div class="info-row svelte-1i20b51"><span class="info-label svelte-1i20b51">Config Directory:</span> <code class="info-value svelte-1i20b51"> </code></div> <div class="info-row svelte-1i20b51"><span class="info-label svelte-1i20b51">Last Sync:</span> <span class="info-value svelte-1i20b51"> </span></div></div> <div class="native-actions svelte-1i20b51"><button class="btn btn-secondary svelte-1i20b51"> </button> <button class="btn btn-primary svelte-1i20b51"> </button></div>',1),ui=f('<div class="native-actions svelte-1i20b51"><button class="btn btn-primary svelte-1i20b51"> </button></div>'),pi=f('<div class="native-error svelte-1i20b51"><svg class="error-icon svelte-1i20b51" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg> <span> </span></div>'),bi=f(`<div class="setting-item native-config svelte-1i20b51"><div class="native-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Status:</span> <!></div> <!> <!> <div class="native-instructions svelte-1i20b51"><h4 class="svelte-1i20b51">Setup Instructions:</h4> <ol class="svelte-1i20b51"><li class="svelte-1i20b51"><strong>Install the native host:</strong> Run <code class="svelte-1i20b51">install_windows.bat</code> (Windows)
 3                  or <code class="svelte-1i20b51">install_macos.sh</code> (macOS/Linux) from the <code class="svelte-1i20b51">native-host</code> folder.</li> <li class="svelte-1i20b51"><strong>Configure Syncthing folder:</strong> The extension syncs to <code class="svelte-1i20b51">~/Syncthing/MnemonicWorkspaces/</code> by default. Create this folder
 4                  and add it to Syncthing.</li> <li class="svelte-1i20b51"><strong>Reload extension:</strong> After installing the native host, reload
 5                  this extension from <code class="svelte-1i20b51">chrome://extensions</code> or <code class="svelte-1i20b51">about:debugging</code>.</li> <li class="svelte-1i20b51"><strong>Click Connect:</strong> The extension will communicate with the native
 6                  host to read/write the backup file.</li></ol> <p class="setup-note svelte-1i20b51"><strong>How it works:</strong> When you click "Sync Now", all your workspaces are
 7                saved to <code class="svelte-1i20b51">workspaces.json</code> in the Syncthing folder. Syncthing then
 8                syncs this file to your other devices. On other devices, use "Check for Changes"
 9                to import updates.</p></div></div>`),fi=f('<span class="status-badge status-active svelte-1i20b51">Configured</span>'),gi=f('<span class="status-badge status-inactive svelte-1i20b51">Not configured</span>'),_i=f('<div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51" for="claude-api-key"><span>API Key</span></label> <div class="api-key-input svelte-1i20b51"><input id="claude-api-key" type="password" placeholder="sk-ant-..." class="input svelte-1i20b51"/> <button class="btn-secondary svelte-1i20b51">Save Key</button></div> <p class="setting-description svelte-1i20b51">Get your API key from <a href="https://console.anthropic.com" target="_blank" rel="noopener noreferrer" class="svelte-1i20b51">console.anthropic.com</a></p></div>'),mi=f('<p class="setting-description svelte-1i20b51" style="color: #EF4444; margin-top: 4px;"> </p>'),yi=f('<div class="setting-item svelte-1i20b51"><div class="api-key-actions svelte-1i20b51"><button class="btn-secondary svelte-1i20b51"><!></button> <button class="btn-danger svelte-1i20b51">Remove API Key</button></div> <!></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Auto-suggest improvements</span></label> <p class="setting-description svelte-1i20b51">Automatically analyze workspaces and suggest organizational improvements</p></div>',1),hi=f('<span class="divider svelte-1i20b51">|</span> <span class="status-label svelte-1i20b51">Custom sites:</span> <span class="site-count custom svelte-1i20b51"> </span>',1),wi=f('<div class="sites-list custom-list svelte-1i20b51"><strong class="svelte-1i20b51">Custom sites:</strong> <span class="sites-preview svelte-1i20b51"> </span></div>'),ki=f('<button class="btn-danger-outline svelte-1i20b51">Reset to Defaults</button>'),Si=f('<span class="save-indicator svelte-1i20b51">Saved!</span>'),xi=f('<div class="setting-item svelte-1i20b51"><div class="pause-media-preview svelte-1i20b51"><div class="sites-list svelte-1i20b51"><strong class="svelte-1i20b51">Default sites:</strong> <span class="sites-preview svelte-1i20b51">YouTube, Vimeo, Twitch, Netflix, Hulu, Disney+, Prime Video, HBO Max, Spotify, SoundCloud, Bandcamp, Tidal, Deezer, Pandora, Invidious (public instances)</span></div> <!></div></div> <div class="setting-item svelte-1i20b51"><div class="pause-media-actions svelte-1i20b51"><button class="btn-secondary svelte-1i20b51">Edit Sites</button> <!> <!></div></div>',1),Ci=f('<div class="setting-item pause-media-editor svelte-1i20b51"><label class="setting-label svelte-1i20b51" for="pause-media-textarea"><span>Edit site patterns</span></label> <textarea id="pause-media-textarea" class="sites-textarea svelte-1i20b51" rows="20" placeholder="Enter site patterns, one per line..."></textarea> <p class="setting-description svelte-1i20b51">Use match patterns like <code class="svelte-1i20b51">*://*.example.com/*</code> or <code class="svelte-1i20b51">*://localhost:8096/*</code> <br/> Lines starting with <code class="svelte-1i20b51">#</code> are comments. Custom sites are saved separately from defaults.</p> <div class="pause-media-actions svelte-1i20b51"><button class="btn-primary svelte-1i20b51">Save Changes</button> <button class="btn-secondary svelte-1i20b51">Cancel</button></div></div>'),Ti=f('<span class="status-badge status-active svelte-1i20b51"> </span>'),Mi=f('<span class="status-badge status-inactive svelte-1i20b51">Not connected</span>'),Ei=f('<span class="status-badge status-active svelte-1i20b51">Access granted</span>'),Ai=f('<span class="status-badge status-inactive svelte-1i20b51">No access</span>'),Pi=f('<div class="graph-directory-info svelte-1i20b51"><span class="directory-label svelte-1i20b51">Directory:</span> <span class="directory-path svelte-1i20b51"> </span></div>'),Ni=f('<button class="btn-secondary btn-danger svelte-1i20b51">Revoke Access</button>'),Di=f('<button class="btn-primary svelte-1i20b51"><!></button>'),Fi=f(`<div class="setting-item graph-access-section svelte-1i20b51"><h4 class="subsection-title svelte-1i20b51">Graph Access for Attachments</h4> <p class="setting-description svelte-1i20b51">Grant access to your Logseq graph folder to store file attachments directly.
10                This allows you to drag and drop files into workspace resources.</p> <div class="graph-access-status svelte-1i20b51"><div class="api-key-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Status:</span> <!></div> <!></div> <div class="api-key-actions svelte-1i20b51"><!></div> <p class="setting-description svelte-1i20b51">When you click "Grant Access", select your Logseq graph root folder.
11                Files will be stored in <code class="svelte-1i20b51">assets/mnemonic/</code> within your graph.</p></div>`),Ii=f(`<div class="setting-item graph-access-section svelte-1i20b51"><h4 class="subsection-title svelte-1i20b51">Graph Access for Attachments</h4> <p class="setting-description warning-text svelte-1i20b51">File attachment storage is not supported in this browser.
12                Use Chrome, Edge, or another Chromium-based browser for full attachment support.</p></div>`),Hi=f(`<div class="setting-item svelte-1i20b51"><div class="api-key-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Status:</span> <!></div></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51" for="logseq-api-url"><span>API URL</span></label> <div class="api-key-input svelte-1i20b51"><input id="logseq-api-url" type="text" placeholder="http://127.0.0.1:12315/api" class="input svelte-1i20b51"/> <button class="btn-secondary svelte-1i20b51">Save</button></div> <p class="setting-description svelte-1i20b51">Default: http://127.0.0.1:12315/api (Logseq's default HTTP API port)</p></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51" for="logseq-token"><span>Auth Token (optional)</span></label> <div class="api-key-input svelte-1i20b51"><input id="logseq-token" type="password" placeholder="Leave empty if not using authentication" class="input svelte-1i20b51"/> <button class="btn-secondary svelte-1i20b51">Save</button></div> <p class="setting-description svelte-1i20b51">Only needed if you've configured Logseq API authentication.</p></div> <div class="setting-item svelte-1i20b51"><div class="api-key-actions svelte-1i20b51"><button class="btn-secondary svelte-1i20b51"><!></button></div></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Auto-sync notes</span></label> <p class="setting-description svelte-1i20b51">Automatically sync notes with Logseq when changes are made</p></div> <!>`,1),Li=f('<span class="status-badge status-active svelte-1i20b51">Connected</span>'),qi=f('<span class="status-badge status-inactive svelte-1i20b51">Disconnected</span>'),Ui=f('<span class="status-badge status-inactive svelte-1i20b51">Not configured</span>'),Bi=f('<div class="info-row svelte-1i20b51"><span class="info-label svelte-1i20b51">Last Sync:</span> <span class="info-value svelte-1i20b51"> </span></div>'),Oi=f('<div class="setting-item svelte-1i20b51"><div class="todoist-info svelte-1i20b51"><div class="info-row svelte-1i20b51"><span class="info-label svelte-1i20b51">Master Project:</span> <span class="info-value svelte-1i20b51"> </span></div> <!> <div class="info-row svelte-1i20b51"><span class="info-label svelte-1i20b51">Auth Method:</span> <span class="info-value svelte-1i20b51"> </span></div></div></div> <div class="setting-item svelte-1i20b51"><div class="api-key-actions svelte-1i20b51"><button class="btn-secondary svelte-1i20b51"><!></button> <button class="btn-danger svelte-1i20b51">Disconnect</button></div></div>',1),zi=f('<div class="setting-item svelte-1i20b51"><p class="setting-description svelte-1i20b51" style="margin-left: 0; color: var(--text-secondary);">API token is saved but connection failed<!></p> <div class="api-key-actions svelte-1i20b51"><button class="btn-secondary svelte-1i20b51"><!></button> <button class="btn-danger svelte-1i20b51">Disconnect</button></div></div>'),Ri=f('<div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51" for="todoist-api-token"><span>API Token</span></label> <div class="api-key-input svelte-1i20b51"><input id="todoist-api-token" type="password" placeholder="Enter your Todoist API token" class="input svelte-1i20b51"/> <button class="btn-secondary svelte-1i20b51"><!></button></div> <p class="setting-description svelte-1i20b51">Get your API token from <a href="https://todoist.com/app/settings/integrations/developer" target="_blank" rel="noopener noreferrer" class="svelte-1i20b51">Todoist Settings &gt; Integrations &gt; Developer</a></p></div>'),Ki=f('<span class="status-badge success svelte-1i20b51">Unlocked</span>'),Vi=f('<span class="status-badge warning svelte-1i20b51">Locked</span>'),Gi=f('<div class="success-message svelte-1i20b51"><svg viewBox="0 0 20 20" fill="currentColor" class="svelte-1i20b51"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <span> </span></div>'),ji=f('<div class="error-message svelte-1i20b51"><svg viewBox="0 0 20 20" fill="currentColor" class="svelte-1i20b51"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg> <span> </span></div>'),Wi=f('<div class="setting-item svelte-1i20b51"><div class="warning-box svelte-1i20b51"><svg viewBox="0 0 20 20" fill="currentColor" class="svelte-1i20b51"><path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg> <span>Enable Native Messaging Sync to use encrypted credential storage.</span></div></div>'),Yi=f('<div class="setting-item svelte-1i20b51"><div class="vault-setup-prompt svelte-1i20b51"><div class="shield-icon svelte-1i20b51"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1i20b51"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path><path d="M9 12l2 2 4-4"></path></svg></div> <div class="vault-prompt-text svelte-1i20b51"><strong class="svelte-1i20b51">Secure your integration credentials</strong> <p class="svelte-1i20b51">Create a master password to encrypt API keys for Claude, Todoist, and Logseq.</p></div> <button class="btn-primary svelte-1i20b51">Setup Encryption</button></div></div>'),Ji=f('<div class="setting-item svelte-1i20b51"><div class="vault-setup-form svelte-1i20b51"><div class="input-group svelte-1i20b51"><label for="vault-new-password" class="svelte-1i20b51">Master Password</label> <input id="vault-new-password" type="password" placeholder="Create a strong password" class="text-input"/></div> <div class="input-group svelte-1i20b51"><label for="vault-confirm-password" class="svelte-1i20b51">Confirm Password</label> <input id="vault-confirm-password" type="password" placeholder="Confirm your password" class="text-input"/></div> <div class="warning-box svelte-1i20b51"><svg viewBox="0 0 20 20" fill="currentColor" class="svelte-1i20b51"><path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg> <span>This password cannot be recovered. Keep it safe!</span></div> <div class="button-row svelte-1i20b51"><button class="btn-secondary svelte-1i20b51">Cancel</button> <button class="btn-primary svelte-1i20b51">Create Master Password</button></div></div></div>'),Qi=f('<div class="setting-item svelte-1i20b51"><div class="vault-status svelte-1i20b51"><div class="vault-status-header svelte-1i20b51"><div class="vault-icon unlocked svelte-1i20b51"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1i20b51"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 9.9-1"></path></svg></div> <div class="vault-status-text svelte-1i20b51"><strong class="svelte-1i20b51">Credential Vault Unlocked</strong> <p class="svelte-1i20b51">Your integration credentials are encrypted and synced.</p></div></div> <div class="vault-credentials-list svelte-1i20b51"><span> </span> <span> </span> <span> </span></div> <div class="vault-actions svelte-1i20b51"><button class="btn-secondary svelte-1i20b51">Change Password</button> <button class="btn-secondary svelte-1i20b51">Lock Vault</button></div></div></div>'),Xi=f('<div class="setting-item svelte-1i20b51"><div class="vault-locked svelte-1i20b51"><div class="vault-icon locked svelte-1i20b51"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1i20b51"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg></div> <div class="vault-locked-text svelte-1i20b51"><strong class="svelte-1i20b51">Credential Vault Locked</strong> <p class="svelte-1i20b51">Enter your master password to unlock and access your encrypted credentials.</p></div> <div class="input-group svelte-1i20b51"><input type="password" placeholder="Enter master password" class="text-input svelte-1i20b51"/> <button class="btn-primary svelte-1i20b51">Unlock</button></div></div></div>'),Zi=f('<div class="setting-item svelte-1i20b51"><div class="vault-setup-form svelte-1i20b51"><h4 class="svelte-1i20b51">Change Master Password</h4> <div class="input-group svelte-1i20b51"><label for="vault-old-password" class="svelte-1i20b51">Current Password</label> <input id="vault-old-password" type="password" placeholder="Enter current password" class="text-input"/></div> <div class="input-group svelte-1i20b51"><label for="vault-new-password-change" class="svelte-1i20b51">New Password</label> <input id="vault-new-password-change" type="password" placeholder="Enter new password" class="text-input"/></div> <div class="input-group svelte-1i20b51"><label for="vault-confirm-password-change" class="svelte-1i20b51">Confirm New Password</label> <input id="vault-confirm-password-change" type="password" placeholder="Confirm new password" class="text-input"/></div> <div class="button-row svelte-1i20b51"><button class="btn-secondary svelte-1i20b51">Cancel</button> <button class="btn-primary svelte-1i20b51">Change Password</button></div></div></div>'),$i=f(`<div class="options svelte-1i20b51"><header class="options-header svelte-1i20b51"><div class="logo-mark svelte-1i20b51">M</div> <h1 class="options-title svelte-1i20b51">Mnemonic Settings</h1></header> <main class="options-content svelte-1i20b51"><section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Auto-Save</h2> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Automatically save workspace state</span></label> <p class="setting-description svelte-1i20b51">Periodically save open tabs and window positions</p></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><span>Save interval</span> <select class="select svelte-1i20b51"><option>15 seconds</option><option>30 seconds</option><option>1 minute</option><option>5 minutes</option></select></label></div></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Window Management</h2> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Prompt when new windows are opened</span></label> <p class="setting-description svelte-1i20b51">Ask whether to add unassigned windows to the current context</p></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Confirm before context switch</span></label> <p class="setting-description svelte-1i20b51">Show a confirmation dialog before closing windows during context switch</p></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Restore window positions</span></label> <p class="setting-description svelte-1i20b51">Restore window size and position when opening workspaces</p></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Multi-monitor aware positioning</span></label> <p class="setting-description svelte-1i20b51">Adapt window positions when monitor configuration changes</p></div> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Lazy load tabs when restoring workspaces</span></label> <p class="setting-description svelte-1i20b51">Only load the active tab initially; other tabs load when clicked. Reduces memory and CPU usage.</p></div></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Appearance</h2> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51" for="theme-select"><span>Theme</span> <select id="theme-select" class="select svelte-1i20b51"><option>System default</option><option>Light</option><option>Dark</option></select></label> <p class="setting-description svelte-1i20b51">Choose the color theme for the extension</p></div></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Sync Backend</h2> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><span>Synchronization method</span> <select class="select svelte-1i20b51"><option>None (local only)</option><option> </option><option>Native Messaging (Syncthing)</option></select></label> <p class="setting-description svelte-1i20b51">Choose how to sync workspaces across devices</p></div> <!> <!></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Claude AI Integration</h2> <p class="section-description svelte-1i20b51">Enable AI-powered workspace suggestions using Claude.</p> <div class="setting-item svelte-1i20b51"><div class="api-key-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Status:</span> <!></div></div> <!></section> <section class="settings-section pause-media-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Pause Media Sites</h2> <p class="section-description svelte-1i20b51">Configure which sites the "Pause Audio" feature applies to. Default sites include YouTube, Vimeo, Twitch, Netflix, Spotify, and more.</p> <div class="setting-item svelte-1i20b51"><div class="pause-media-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Default sites:</span> <span class="site-count svelte-1i20b51"> </span> <!></div></div> <!> <div class="setting-item pause-media-info svelte-1i20b51"><p class="setting-description note svelte-1i20b51"><strong>Note:</strong> Default sites use pre-injected content scripts for instant response.
13            Custom sites (especially those with ports like <code class="svelte-1i20b51">:3000</code>) work via programmatic injection when you click "Pause Audio".</p></div></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Logseq Integration</h2> <p class="section-description svelte-1i20b51">Sync workspace notes with Logseq for a connected knowledge graph.</p> <div class="setting-item svelte-1i20b51"><label class="setting-label svelte-1i20b51"><input type="checkbox" class="checkbox svelte-1i20b51"/> <span>Enable Logseq Notes</span></label> <p class="setting-description svelte-1i20b51">Store workspace notes in Logseq. Requires Logseq to be running with HTTP API enabled.</p></div> <!> <div class="setting-item logseq-instructions svelte-1i20b51"><h4 class="svelte-1i20b51">How to enable Logseq HTTP API:</h4> <ol class="svelte-1i20b51"><li class="svelte-1i20b51">Open Logseq</li> <li class="svelte-1i20b51">Go to Settings (gear icon)</li> <li class="svelte-1i20b51">Enable "HTTP APIs server" under Features</li> <li class="svelte-1i20b51">Restart Logseq</li> <li class="svelte-1i20b51">The API will be available at http://127.0.0.1:12315/api</li></ol></div></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Todoist Integration</h2> <p class="section-description svelte-1i20b51">Sync workspace tasks with Todoist for cross-platform task management.</p> <div class="setting-item svelte-1i20b51"><div class="api-key-status svelte-1i20b51"><span class="status-label svelte-1i20b51">Status:</span> <!></div></div> <!> <div class="setting-item todoist-instructions svelte-1i20b51"><h4 class="svelte-1i20b51">How it works:</h4> <ol class="svelte-1i20b51"><li class="svelte-1i20b51">A "Mnemonic" project is created in your Todoist account</li> <li class="svelte-1i20b51">Each workspace becomes a sub-project under Mnemonic</li> <li class="svelte-1i20b51">Child workspaces become sub-projects of their parent</li> <li class="svelte-1i20b51">Tasks sync automatically between the extension and Todoist</li></ol> <p class="setup-note svelte-1i20b51"><strong>Tip:</strong> Tasks created in Todoist will appear in the workspace dashboard.
14            Use Todoist's mobile app to manage tasks on the go!</p></div></section> <section class="settings-section svelte-1i20b51"><h2 class="section-title svelte-1i20b51">Security <!></h2> <div class="setting-item svelte-1i20b51"><p class="setting-description svelte-1i20b51" style="margin-left: 0; margin-bottom: 1rem;">Encrypt your integration credentials (API keys) with a master password.
15            Encrypted credentials sync securely across devices via the sync daemon.</p> <!> <!></div> <!> <div class="setting-item security-info svelte-1i20b51"><h4 class="svelte-1i20b51">How credential encryption works:</h4> <ul class="svelte-1i20b51"><li class="svelte-1i20b51">Your master password is never stored - only you know it</li> <li class="svelte-1i20b51">A 256-bit encryption key is derived using PBKDF2</li> <li class="svelte-1i20b51">Credentials are encrypted with AES-256-GCM</li> <li class="svelte-1i20b51">Encrypted data syncs via daemon - decryptable only with your password</li> <li class="svelte-1i20b51">On new devices, just enter your master password to restore credentials</li></ul></div></section></main> <footer class="options-footer svelte-1i20b51"><button class="btn-primary svelte-1i20b51"><!></button></footer></div>`);function en(be,o){Ga(o,!0);let l=g(St({autoSave:!0,autoSaveInterval:3e4,showOrphanPrompt:!0,syncBackend:"none",confirmContextSwitch:!0,restoreWindowPositions:!0,useSmartPositioning:!0,theme:"system",lazyLoadTabs:!0,pauseMediaSites:[]})),M=g(!1),P=g(""),H=g(!1),X=g(!1),he=g(!1);const Xe=Pt(),Ne=si();let Be=g(!1),we=g(null),Ze=g(!1),$e=g(null),ke=g(!1),lt=g(null),ct=g(null),Se=g(!1),et=g(!1),de=g(null),xe=g(""),De=g(!1),Oe=g(!1),tt=g(!1),Ce=g(null),Fe=g("");const fe=Ya();let U=g(St({...Ja})),Te=g(!1),Me=g(null),st=g(!1),Ie=g(null);const at=Qa(),ze=Xa();let Ee=g(!1),Re=g(null),it=g(!1),Ae=g(!1),te=g(null),Pe=g(""),le=g(!1),ee=g(null),Ke=g(!1),Ve=g(!1),ae=g(St({claude:!1,todoist:!1,logseq:!1})),Ge=g(!1),je=g(!1),ne=g(""),Y=g(""),ie=g(""),J=g(null),re=g(null);Ka(async()=>{var n;const e=await L.storage.local.get("workspaceConfig");if((n=e.workspaceConfig)!=null&&n.settings&&s(l,{...t(l),...e.workspaceConfig.settings},!0),t(l).syncBackend==="filesystem"&&Xe){const c=await Ne.connect();if(s(Be,c,!0),c){const p=Ne.getState();s(we,p.configDir||null,!0)}}t(l).syncBackend==="native"&&await rt();try{const c=await L.runtime.sendMessage({type:"GET_CLAUDE_SETTINGS"});s(De,c.enabled||!1,!0),s(Oe,c.autoSuggest||!1,!0)}catch{}try{const c=await L.storage.local.get("logseqSettings");if(c.logseqSettings&&(s(U,{...t(U),...c.logseqSettings},!0),fe.setSettings({...t(U)})),t(U).enabled){const p=await fe.checkConnection();s(Te,p.available,!0),s(Me,p.graphName,!0)}if(at){const p=await ze.restoreAccess(),_=ze.getState();s(Ee,p,!0),s(Re,_.directoryPath,!0)}}catch{}try{const c=await Tt.loadSettings();s(Ae,c.enabled||!1,!0),t(Ae)&&c.accessToken&&s(te,await Qe.initializeFromStorage(),!0)}catch{}await nt(),t(Ve)&&(t(ae).claude||t(ae).todoist||t(ae).logseq)&&await Nt()});async function nt(){try{const e=await L.runtime.sendMessage({type:"VAULT_STATUS"});e.success&&(s(Ke,e.exists,!0),s(Ve,e.unlocked,!0),s(ae,e.credentials||{claude:!1,todoist:!1,logseq:!1},!0))}catch{}}async function Nt(){if(t(ae).claude)try{const e=await L.runtime.sendMessage({type:"VAULT_GET_CREDENTIAL",payload:{type:"claude"}});if(e.success&&e.credential){const n=e.credential;n.apiKey&&(await L.runtime.sendMessage({type:"SET_CLAUDE_API_KEY",payload:{apiKey:n.apiKey}}),s(De,!0),s(Oe,n.autoSuggest||!1,!0))}}catch(e){console.warn("[Mnemonic] Failed to load Claude credentials from vault:",e)}if(t(ae).todoist)try{const e=await L.runtime.sendMessage({type:"VAULT_GET_CREDENTIAL",payload:{type:"todoist"}});if(e.success&&e.credential){const n=e.credential;n.accessToken&&(await Tt.saveSettings({enabled:!0,authMethod:n.authMethod||"api_token",accessToken:n.accessToken,masterProjectId:n.masterProjectId}),s(Ae,!0),s(te,await Qe.initializeFromStorage(),!0))}}catch(e){console.warn("[Mnemonic] Failed to load Todoist credentials from vault:",e)}if(t(ae).logseq)try{const e=await L.runtime.sendMessage({type:"VAULT_GET_CREDENTIAL",payload:{type:"logseq"}});if(e.success&&e.credential){const n=e.credential;if(n.authToken){s(U,{...t(U),enabled:!0,apiUrl:n.apiUrl||t(U).apiUrl,authToken:n.authToken,autoSync:n.autoSync??t(U).autoSync,syncInterval:n.syncInterval??t(U).syncInterval},!0),fe.setSettings({...t(U)}),await L.storage.local.set({logseqSettings:{...t(U)}});const c=await fe.checkConnection();s(Te,c.available,!0),s(Me,c.graphName,!0)}}}catch(e){console.warn("[Mnemonic] Failed to load Logseq credentials from vault:",e)}}async function bs(){s(Ze,!0),s($e,null);try{if(await Ne.selectDirectory()){s(Be,!0);const n=Ne.getState();s(we,n.configDir||null,!0),await L.runtime.sendMessage({type:"INIT_SYNC_BACKEND",payload:{backendType:"filesystem"}})}}catch(e){s($e,e instanceof Error?e.message:"Failed to select directory",!0)}finally{s(Ze,!1)}}async function fs(){if(t(l).syncBackend==="filesystem"&&Xe){const e=await Ne.connect();if(s(Be,e,!0),e){const n=Ne.getState();s(we,n.configDir||null,!0)}}else s(Be,!1),s(we,null);t(l).syncBackend==="native"?await rt():(s(ke,!1),s(lt,null),s(de,null))}async function rt(){var e,n;s(Se,!0),s(de,null);try{await L.runtime.sendMessage({type:"INIT_SYNC_BACKEND",payload:{backendType:"native"}});const c=await L.runtime.sendMessage({type:"TEST_SYNC_CONNECTION"});if(c.success){s(ke,!0),s(lt,((e=c.info)==null?void 0:e.configDir)||null,!0);const p=await L.runtime.sendMessage({type:"GET_SYNC_STATE"});s(ct,((n=p.state)==null?void 0:n.lastSyncTime)||null,!0)}else s(ke,!1),s(de,c.error||"Failed to connect to native host",!0)}catch(c){s(ke,!1),s(de,c instanceof Error?c.message:"Connection test failed",!0)}finally{s(Se,!1)}}async function gs(){s(et,!0),s(de,null);try{const e=await L.runtime.sendMessage({type:"SYNC_NOW"});e.success?s(ct,new Date().toISOString(),!0):s(de,e.error||"Sync failed",!0)}catch(e){s(de,e instanceof Error?e.message:"Sync failed",!0)}finally{s(et,!1)}}function Dt(e){if(!e)return"Never";try{const n=new Date(e),p=new Date().getTime()-n.getTime(),_=Math.floor(p/6e4),b=Math.floor(p/36e5);return _<1?"Just now":_<60?`${_} min ago`:b<24?`${b} hour${b>1?"s":""} ago`:n.toLocaleDateString()}catch{return"Unknown"}}async function vt(){s(X,!0);try{const n=(await L.storage.local.get("workspaceConfig")).workspaceConfig||{};n.settings={...t(l)},n.metadata={...n.metadata,lastModified:new Date().toISOString()},await L.storage.local.set({workspaceConfig:n}),s(he,!0),setTimeout(()=>s(he,!1),2e3)}catch(e){console.error("[Mnemonic] Failed to save settings:",e)}finally{s(X,!1)}}async function _s(){if(t(xe).trim())try{await L.runtime.sendMessage({type:"SET_CLAUDE_API_KEY",payload:{apiKey:t(xe).trim()}}),s(De,!0),s(xe,"")}catch(e){console.error("[Mnemonic] Failed to save Claude API key:",e)}}async function ms(){try{await L.runtime.sendMessage({type:"SET_CLAUDE_API_KEY",payload:{apiKey:null}}),s(De,!1),s(xe,"")}catch(e){console.error("[Mnemonic] Failed to clear Claude API key:",e)}}async function ys(){s(tt,!0),s(Ce,null),s(Fe,"");try{const e=await L.runtime.sendMessage({type:"TEST_CLAUDE_CONNECTION"});s(Ce,e.success?"success":"error",!0),s(Fe,e.error||"",!0)}catch{s(Ce,"error"),s(Fe,"Failed to connect to background service")}finally{s(tt,!1),setTimeout(()=>{s(Ce,null),s(Fe,"")},5e3)}}async function hs(){try{await L.runtime.sendMessage({type:"UPDATE_CLAUDE_SETTINGS",payload:{autoSuggest:t(Oe)}})}catch(e){console.error("[Mnemonic] Failed to update Claude settings:",e)}}async function ot(){try{const e={...t(U)};if(await L.storage.local.set({logseqSettings:e}),fe.setSettings(e),t(U).enabled){const n=await fe.checkConnection();s(Te,n.available,!0),s(Me,n.graphName,!0)}else s(Te,!1),s(Me,null)}catch(e){console.error("[Mnemonic] Failed to save Logseq settings:",e)}}async function ws(){s(st,!0),s(Ie,null);try{fe.setSettings({...t(U)});const e=await fe.checkConnection();s(Te,e.available,!0),s(Me,e.graphName,!0),s(Ie,e.available?"success":"error",!0)}catch{s(Ie,"error"),s(Te,!1),s(Me,null)}finally{s(st,!1),setTimeout(()=>s(Ie,null),3e3)}}function ks(){t(U).enabled=!t(U).enabled,ot()}async function Ss(){if(at){s(it,!0);try{const e=await ze.requestAccess(),n=ze.getState();s(Ee,e,!0),s(Re,n.directoryPath,!0)}catch(e){console.error("[Mnemonic] Failed to request graph access:",e),s(Ee,!1)}finally{s(it,!1)}}}async function xs(){if(at)try{await ze.revokeAccess(),s(Ee,!1),s(Re,null)}catch(e){console.error("[Mnemonic] Failed to revoke graph access:",e)}}async function Cs(){if(t(Pe).trim()){s(le,!0),s(ee,null);try{(await Tt.authenticateWithApiToken(t(Pe).trim())).success?(s(Ae,!0),s(te,await Qe.initializeFromStorage(),!0),s(Pe,""),s(ee,"success")):s(ee,"error")}catch{s(ee,"error")}finally{s(le,!1),setTimeout(()=>s(ee,null),3e3)}}}async function Ft(){var e;s(le,!0),s(ee,null);try{s(te,await Qe.initializeFromStorage(),!0),s(ee,(e=t(te))!=null&&e.connected?"success":"error",!0)}catch{s(ee,"error")}finally{s(le,!1),setTimeout(()=>s(ee,null),3e3)}}async function It(){await Qe.disconnect(),await Za.clearAllMappings(),s(Ae,!1),s(te,null),s(Pe,"")}async function Ts(){if(t(Y).length<8){s(J,"Password must be at least 8 characters");return}if(t(Y)!==t(ie)){s(J,"Passwords do not match");return}s(J,null),s(re,null);try{const e=await L.runtime.sendMessage({type:"VAULT_SETUP",payload:{password:t(Y)}});e.success?(s(Ge,!1),s(Y,""),s(ie,""),s(re,"Master password created successfully"),await nt(),setTimeout(()=>s(re,null),3e3)):s(J,e.error||"Failed to setup vault",!0)}catch(e){s(J,e instanceof Error?e.message:"Failed to setup vault",!0)}}async function Ms(){if(t(Y).length<8){s(J,"New password must be at least 8 characters");return}if(t(Y)!==t(ie)){s(J,"New passwords do not match");return}s(J,null),s(re,null);try{const e=await L.runtime.sendMessage({type:"VAULT_CHANGE_PASSWORD",payload:{oldPassword:t(ne),newPassword:t(Y)}});e.success?(s(je,!1),s(ne,""),s(Y,""),s(ie,""),s(re,"Master password changed successfully"),setTimeout(()=>s(re,null),3e3)):s(J,e.error||"Failed to change password",!0)}catch(e){s(J,e instanceof Error?e.message:"Failed to change password",!0)}}async function Es(){try{await L.runtime.sendMessage({type:"VAULT_LOCK"}),await nt()}catch(e){s(J,e instanceof Error?e.message:"Failed to lock vault",!0)}}async function Ht(){if(t(ne)){s(J,null),s(re,null);try{const e=await L.runtime.sendMessage({type:"VAULT_UNLOCK",payload:{password:t(ne)}});e.success?(s(ne,""),s(re,"Vault unlocked - restoring integrations..."),await nt(),await Nt(),s(re,"Vault unlocked and integrations restored"),setTimeout(()=>s(re,null),3e3)):s(J,e.error||"Incorrect password",!0)}catch(e){s(J,e instanceof Error?e.message:"Failed to unlock vault",!0)}}}function As(){const e=t(l).pauseMediaSites||[],n=["# Default sites (pre-injected for better performance)",...At,"","# Your custom sites (add below this line)","# Sites with ports (e.g., :3000) work via programmatic injection",...e];s(P,n.join(`
16  `),!0),s(M,!0)}function Ps(){s(M,!1),s(P,"")}async function Ns(){const e=t(P).split(`
17  `),n=[];for(const c of e){const p=c.trim();p.includes("Your custom sites")||p.includes("custom sites")||!p||p.startsWith("#")||At.includes(p)||n.push(p)}t(l).pauseMediaSites=n,await vt(),s(M,!1),s(P,""),s(H,!0),setTimeout(()=>s(H,!1),2e3)}function Ds(){t(l).pauseMediaSites=[],vt(),s(H,!0),setTimeout(()=>s(H,!1),2e3)}var Lt=$i(),qt=i(a(Lt),2),Ut=a(qt),Bt=i(a(Ut),2),Fs=a(Bt),Is=a(Fs),Hs=i(Bt,2),Ls=a(Hs),dt=i(a(Ls),2),ut=a(dt);ut.value=ut.__value=15e3;var pt=i(ut);pt.value=pt.__value=3e4;var bt=i(pt);bt.value=bt.__value=6e4;var Ot=i(bt);Ot.value=Ot.__value=3e5;var zt=i(Ut,2),Rt=i(a(zt),2),qs=a(Rt),Us=a(qs),Kt=i(Rt,2),Bs=a(Kt),Os=a(Bs),Vt=i(Kt,2),zs=a(Vt),Rs=a(zs),Gt=i(Vt,2),Ks=a(Gt),jt=a(Ks),Vs=i(Gt,2),Gs=a(Vs),js=a(Gs),Wt=i(zt,2),Ws=i(a(Wt),2),Ys=a(Ws),Yt=i(a(Ys),2),ft=a(Yt);ft.value=ft.__value="system";var gt=i(ft);gt.value=gt.__value="light";var Jt=i(gt);Jt.value=Jt.__value="dark";var Qt=i(Wt,2),Xt=i(a(Qt),2),Js=a(Xt),_t=i(a(Js),2);_t.__change=fs;var mt=a(_t);mt.value=mt.__value="none";var We=i(mt),Qs=a(We);We.value=We.__value="filesystem";var Zt=i(We);Zt.value=Zt.__value="native";var $t=i(Xt,2);{var Xs=e=>{var n=oi(),c=a(n),p=i(a(c),2);{var _=v=>{var d=ai();r(v,d)},b=v=>{var d=ii();r(v,d)};u(p,v=>{t(Be)?v(_):v(b,!1)})}var x=i(c,2);{var z=v=>{var d=ni(),S=i(a(d),2),y=a(S);D(()=>q(y,t(we))),r(v,d)};u(x,v=>{t(we)&&v(z)})}var R=i(x,2),O=a(R);O.__click=bs;var K=a(O),m=i(R,2);{var A=v=>{var d=ri(),S=a(d);D(()=>q(S,t($e))),r(v,d)};u(m,v=>{t($e)&&v(A)})}D(()=>{O.disabled=t(Ze),q(K,t(Ze)?"Selecting...":t(we)?"Change Directory":"Select Directory")}),r(e,n)};u($t,e=>{t(l).syncBackend==="filesystem"&&e(Xs)})}var Zs=i($t,2);{var $s=e=>{var n=bi(),c=a(n),p=i(a(c),2);{var _=m=>{var A=li();r(m,A)},b=m=>{var A=j(),v=F(A);{var d=y=>{var h=ci();r(y,h)},S=y=>{var h=vi();r(y,h)};u(v,y=>{t(ke)?y(d):y(S,!1)},!0)}r(m,A)};u(p,m=>{t(Se)?m(_):m(b,!1)})}var x=i(c,2);{var z=m=>{var A=di(),v=F(A),d=a(v),S=i(a(d),2),y=a(S),h=i(d,2),B=i(a(h),2),w=a(B),C=i(v,2),E=a(C);E.__click=rt;var V=a(E),N=i(E,2);N.__click=gs;var T=a(N);D(G=>{q(y,t(lt)||"Unknown"),q(w,G),E.disabled=t(Se),q(V,t(Se)?"Testing...":"Test Connection"),N.disabled=t(et),q(T,t(et)?"Syncing...":"Sync Now")},[()=>Dt(t(ct))]),r(m,A)},R=m=>{var A=ui(),v=a(A);v.__click=rt;var d=a(v);D(()=>{v.disabled=t(Se),q(d,t(Se)?"Connecting...":"Connect")}),r(m,A)};u(x,m=>{t(ke)?m(z):m(R,!1)})}var O=i(x,2);{var K=m=>{var A=pi(),v=i(a(A),2),d=a(v);D(()=>q(d,t(de))),r(m,A)};u(O,m=>{t(de)&&m(K)})}r(e,n)};u(Zs,e=>{t(l).syncBackend==="native"&&e($s)})}var es=i(Qt,2),ts=i(a(es),4),ea=a(ts),ta=i(a(ea),2);{var sa=e=>{var n=fi();r(e,n)},aa=e=>{var n=gi();r(e,n)};u(ta,e=>{t(De)?e(sa):e(aa,!1)})}var ia=i(ts,2);{var na=e=>{var n=_i(),c=i(a(n),2),p=a(c),_=i(p,2);_.__click=_s,D(b=>_.disabled=b,[()=>!t(xe).trim()]),oe(p,()=>t(xe),b=>s(xe,b)),r(e,n)},ra=e=>{var n=yi(),c=F(n),p=a(c),_=a(p);_.__click=ys;var b=a(_);{var x=d=>{var S=I("Testing...");r(d,S)},z=d=>{var S=j(),y=F(S);{var h=w=>{var C=I("Connected!");r(w,C)},B=w=>{var C=j(),E=F(C);{var V=T=>{var G=I("Failed");r(T,G)},N=T=>{var G=I("Test Connection");r(T,G)};u(E,T=>{t(Ce)==="error"?T(V):T(N,!1)},!0)}r(w,C)};u(y,w=>{t(Ce)==="success"?w(h):w(B,!1)},!0)}r(d,S)};u(b,d=>{t(tt)?d(x):d(z,!1)})}var R=i(_,2);R.__click=ms;var O=i(p,2);{var K=d=>{var S=mi(),y=a(S);D(()=>q(y,t(Fe))),r(d,S)};u(O,d=>{t(Ce)==="error"&&t(Fe)&&d(K)})}var m=i(c,2),A=a(m),v=a(A);v.__change=hs,D(()=>_.disabled=t(tt)),me(v,()=>t(Oe),d=>s(Oe,d)),r(e,n)};u(ia,e=>{t(De)?e(ra,!1):e(na)})}var ss=i(es,2),as=i(a(ss),4),oa=a(as),is=i(a(oa),2),la=a(is),ca=i(is,2);{var va=e=>{var n=hi(),c=i(F(n),4),p=a(c);D(()=>{var _;return q(p,`${(((_=t(l).pauseMediaSites)==null?void 0:_.length)||0)??""} sites`)}),r(e,n)};u(ca,e=>{var n;(((n=t(l).pauseMediaSites)==null?void 0:n.length)||0)>0&&e(va)})}var da=i(as,2);{var ua=e=>{var n=xi(),c=F(n),p=a(c),_=i(a(p),2);{var b=v=>{var d=wi(),S=i(a(d),2),y=a(S);D(h=>q(y,h),[()=>{var h;return(h=t(l).pauseMediaSites)==null?void 0:h.join(", ")}]),r(v,d)};u(_,v=>{var d;(((d=t(l).pauseMediaSites)==null?void 0:d.length)||0)>0&&v(b)})}var x=i(c,2),z=a(x),R=a(z);R.__click=As;var O=i(R,2);{var K=v=>{var d=ki();d.__click=Ds,r(v,d)};u(O,v=>{var d;(((d=t(l).pauseMediaSites)==null?void 0:d.length)||0)>0&&v(K)})}var m=i(O,2);{var A=v=>{var d=Si();r(v,d)};u(m,v=>{t(H)&&v(A)})}r(e,n)},pa=e=>{var n=Ci(),c=i(a(n),2),p=i(c,4),_=a(p);_.__click=Ns;var b=i(_,2);b.__click=Ps,oe(c,()=>t(P),x=>s(P,x)),r(e,n)};u(da,e=>{t(M)?e(pa,!1):e(ua)})}var ns=i(ss,2),rs=i(a(ns),4),ba=a(rs),os=a(ba);os.__change=ks;var fa=i(rs,2);{var ga=e=>{var n=Hi(),c=F(n),p=a(c),_=i(a(p),2);{var b=k=>{var Q=Ti(),$=a(Q);D(()=>q($,`Connected to ${t(Me)??""}`)),r(k,Q)},x=k=>{var Q=Mi();r(k,Q)};u(_,k=>{t(Te)?k(b):k(x,!1)})}var z=i(c,2),R=i(a(z),2),O=a(R),K=i(O,2);K.__click=ot;var m=i(z,2),A=i(a(m),2),v=a(A),d=i(v,2);d.__click=ot;var S=i(m,2),y=a(S),h=a(y);h.__click=ws;var B=a(h);{var w=k=>{var Q=I("Testing...");r(k,Q)},C=k=>{var Q=j(),$=F(Q);{var ce=ve=>{var ge=I("Connected!");r(ve,ge)},He=ve=>{var ge=j(),Le=F(ge);{var qe=_e=>{var Ye=I("Failed");r(_e,Ye)},ue=_e=>{var Ye=I("Test Connection");r(_e,Ye)};u(Le,_e=>{t(Ie)==="error"?_e(qe):_e(ue,!1)},!0)}r(ve,ge)};u($,ve=>{t(Ie)==="success"?ve(ce):ve(He,!1)},!0)}r(k,Q)};u(B,k=>{t(st)?k(w):k(C,!1)})}var E=i(S,2),V=a(E),N=a(V);N.__change=ot;var T=i(E,2);{var G=k=>{var Q=Fi(),$=i(a(Q),4),ce=a($),He=i(a(ce),2);{var ve=Z=>{var se=Ei();r(Z,se)},ge=Z=>{var se=Ai();r(Z,se)};u(He,Z=>{t(Ee)?Z(ve):Z(ge,!1)})}var Le=i(ce,2);{var qe=Z=>{var se=Pi(),ht=i(a(se),2),wt=a(ht);D(()=>q(wt,t(Re))),r(Z,se)};u(Le,Z=>{t(Ee)&&t(Re)&&Z(qe)})}var ue=i($,2),_e=a(ue);{var Ye=Z=>{var se=Ni();se.__click=xs,r(Z,se)},Ua=Z=>{var se=Di();se.__click=Ss;var ht=a(se);{var wt=Ue=>{var kt=I("Requesting...");r(Ue,kt)},Ba=Ue=>{var kt=I("Grant Access");r(Ue,kt)};u(ht,Ue=>{t(it)?Ue(wt):Ue(Ba,!1)})}D(()=>se.disabled=t(it)),r(Z,se)};u(_e,Z=>{t(Ee)?Z(Ye):Z(Ua,!1)})}r(k,Q)},W=k=>{var Q=Ii();r(k,Q)};u(T,k=>{at?k(G):k(W,!1)})}D(()=>h.disabled=t(st)),oe(O,()=>t(U).apiUrl,k=>t(U).apiUrl=k),oe(v,()=>t(U).authToken,k=>t(U).authToken=k),me(N,()=>t(U).autoSync,k=>t(U).autoSync=k),r(e,n)};u(fa,e=>{t(U).enabled&&e(ga)})}var ls=i(ns,2),cs=i(a(ls),4),_a=a(cs),ma=i(a(_a),2);{var ya=e=>{var n=Li();r(e,n)},ha=e=>{var n=j(),c=F(n);{var p=b=>{var x=qi();r(b,x)},_=b=>{var x=Ui();r(b,x)};u(c,b=>{t(Ae)?b(p):b(_,!1)},!0)}r(e,n)};u(ma,e=>{var n;(n=t(te))!=null&&n.connected?e(ya):e(ha,!1)})}var wa=i(cs,2);{var ka=e=>{var n=Oi(),c=F(n),p=a(c),_=a(p),b=i(a(_),2),x=a(b),z=i(_,2);{var R=w=>{var C=Bi(),E=i(a(C),2),V=a(E);D(N=>q(V,N),[()=>Dt(t(te).lastSync)]),r(w,C)};u(z,w=>{t(te).lastSync&&w(R)})}var O=i(z,2),K=i(a(O),2),m=a(K),A=i(c,2),v=a(A),d=a(v);d.__click=Ft;var S=a(d);{var y=w=>{var C=I("Testing...");r(w,C)},h=w=>{var C=j(),E=F(C);{var V=T=>{var G=I("Connected!");r(T,G)},N=T=>{var G=j(),W=F(G);{var k=$=>{var ce=I("Failed");r($,ce)},Q=$=>{var ce=I("Test Connection");r($,ce)};u(W,$=>{t(ee)==="error"?$(k):$(Q,!1)},!0)}r(T,G)};u(E,T=>{t(ee)==="success"?T(V):T(N,!1)},!0)}r(w,C)};u(S,w=>{t(le)?w(y):w(h,!1)})}var B=i(d,2);B.__click=It,D(()=>{q(x,t(te).masterProjectName),q(m,t(te).authMethod==="oauth"?"OAuth":"API Token"),d.disabled=t(le)}),r(e,n)},Sa=e=>{var n=j(),c=F(n);{var p=b=>{var x=zi(),z=a(x),R=i(a(z));{var O=y=>{var h=I();D(()=>q(h,`: ${t(te).error??""}`)),r(y,h)};u(R,y=>{var h;(h=t(te))!=null&&h.error&&y(O)})}var K=i(z,2),m=a(K);m.__click=Ft;var A=a(m);{var v=y=>{var h=I("Reconnecting...");r(y,h)},d=y=>{var h=j(),B=F(h);{var w=E=>{var V=I("Connected!");r(E,V)},C=E=>{var V=j(),N=F(V);{var T=W=>{var k=I("Failed");r(W,k)},G=W=>{var k=I("Retry Connection");r(W,k)};u(N,W=>{t(ee)==="error"?W(T):W(G,!1)},!0)}r(E,V)};u(B,E=>{t(ee)==="success"?E(w):E(C,!1)},!0)}r(y,h)};u(A,y=>{t(le)?y(v):y(d,!1)})}var S=i(m,2);S.__click=It,D(()=>m.disabled=t(le)),r(b,x)},_=b=>{var x=Ri(),z=i(a(x),2),R=a(z),O=i(R,2);O.__click=Cs;var K=a(O);{var m=v=>{var d=I("Connecting...");r(v,d)},A=v=>{var d=j(),S=F(d);{var y=B=>{var w=I("Connected!");r(B,w)},h=B=>{var w=j(),C=F(w);{var E=N=>{var T=I("Failed");r(N,T)},V=N=>{var T=I("Connect");r(N,T)};u(C,N=>{t(ee)==="error"?N(E):N(V,!1)},!0)}r(B,w)};u(S,B=>{t(ee)==="success"?B(y):B(h,!1)},!0)}r(v,d)};u(K,v=>{t(le)?v(m):v(A,!1)})}D(v=>O.disabled=v,[()=>!t(Pe).trim()||t(le)]),oe(R,()=>t(Pe),v=>s(Pe,v)),r(b,x)};u(c,b=>{t(Ae)?b(p):b(_,!1)},!0)}r(e,n)};u(wa,e=>{var n;(n=t(te))!=null&&n.connected?e(ka):e(Sa,!1)})}var xa=i(ls,2),vs=a(xa),Ca=i(a(vs));{var Ta=e=>{var n=Ki();r(e,n)},Ma=e=>{var n=j(),c=F(n);{var p=_=>{var b=Vi();r(_,b)};u(c,_=>{t(Ke)&&_(p)},!0)}r(e,n)};u(Ca,e=>{t(Ve)?e(Ta):e(Ma,!1)})}var ds=i(vs,2),us=i(a(ds),2);{var Ea=e=>{var n=Gi(),c=i(a(n),2),p=a(c);D(()=>q(p,t(re))),r(e,n)};u(us,e=>{t(re)&&e(Ea)})}var Aa=i(us,2);{var Pa=e=>{var n=ji(),c=i(a(n),2),p=a(c);D(()=>q(p,t(J))),r(e,n)};u(Aa,e=>{t(J)&&e(Pa)})}var Na=i(ds,2);{var Da=e=>{var n=Wi();r(e,n)},Fa=e=>{var n=j(),c=F(n);{var p=b=>{var x=Yi(),z=a(x),R=i(a(z),4);R.__click=()=>s(Ge,!0),r(b,x)},_=b=>{var x=j(),z=F(x);{var R=K=>{var m=Ji(),A=a(m),v=a(A),d=i(a(v),2),S=i(v,2),y=i(a(S),2),h=i(S,4),B=a(h);B.__click=()=>{s(Ge,!1),s(Y,""),s(ie,""),s(J,null)};var w=i(B,2);w.__click=Ts,D(()=>w.disabled=!t(Y)||!t(ie)||t(Y)!==t(ie)),oe(d,()=>t(Y),C=>s(Y,C)),oe(y,()=>t(ie),C=>s(ie,C)),r(K,m)},O=K=>{var m=j(),A=F(m);{var v=S=>{var y=Qi(),h=a(y),B=i(a(h),2),w=a(B),C=a(w),E=i(w,2),V=a(E),N=i(E,2),T=a(N),G=i(B,2),W=a(G);W.__click=()=>s(je,!0);var k=i(W,2);k.__click=Es,D(()=>{Ct(w,1,`cred-item ${t(ae).claude?"stored":"empty"}`,"svelte-1i20b51"),q(C,`Claude ${t(ae).claude?"(stored)":"(not set)"}`),Ct(E,1,`cred-item ${t(ae).todoist?"stored":"empty"}`,"svelte-1i20b51"),q(V,`Todoist ${t(ae).todoist?"(stored)":"(not set)"}`),Ct(N,1,`cred-item ${t(ae).logseq?"stored":"empty"}`,"svelte-1i20b51"),q(T,`Logseq ${t(ae).logseq?"(stored)":"(not set)"}`)}),r(S,y)},d=S=>{var y=j(),h=F(y);{var B=C=>{var E=Xi(),V=a(E),N=i(a(V),4),T=a(N);T.__keydown=W=>W.key==="Enter"&&Ht();var G=i(T,2);G.__click=Ht,D(()=>G.disabled=!t(ne)),oe(T,()=>t(ne),W=>s(ne,W)),r(C,E)},w=C=>{var E=j(),V=F(E);{var N=T=>{var G=Zi(),W=a(G),k=i(a(W),2),Q=i(a(k),2),$=i(k,2),ce=i(a($),2),He=i($,2),ve=i(a(He),2),ge=i(He,2),Le=a(ge);Le.__click=()=>{s(je,!1),s(ne,""),s(Y,""),s(ie,""),s(J,null)};var qe=i(Le,2);qe.__click=Ms,D(()=>qe.disabled=!t(ne)||!t(Y)||t(Y)!==t(ie)),oe(Q,()=>t(ne),ue=>s(ne,ue)),oe(ce,()=>t(Y),ue=>s(Y,ue)),oe(ve,()=>t(ie),ue=>s(ie,ue)),r(T,G)};u(V,T=>{t(je)&&T(N)},!0)}r(C,E)};u(h,C=>{t(Ke)&&!t(Ve)?C(B):C(w,!1)},!0)}r(S,y)};u(A,S=>{t(Ke)&&t(Ve)&&!t(je)?S(v):S(d,!1)},!0)}r(K,m)};u(z,K=>{t(Ge)?K(R):K(O,!1)},!0)}r(b,x)};u(c,b=>{!t(Ke)&&!t(Ge)?b(p):b(_,!1)},!0)}r(e,n)};u(Na,e=>{!t(ke)&&t(l).syncBackend!=="native"?e(Da):e(Fa,!1)})}var Ia=i(qt,2),yt=a(Ia);yt.__click=vt;var Ha=a(yt);{var La=e=>{var n=I("Saving...");r(e,n)},qa=e=>{var n=j(),c=F(n);{var p=b=>{var x=I("Saved!");r(b,x)},_=b=>{var x=I("Save Settings");r(b,x)};u(c,b=>{t(he)?b(p):b(_,!1)},!0)}r(e,n)};u(Ha,e=>{t(X)?e(La):e(qa,!1)})}D(()=>{dt.disabled=!t(l).autoSave,jt.disabled=!t(l).restoreWindowPositions,We.disabled=!Xe,q(Qs,`File System ${Xe?"":"(Not Supported)"}`),q(la,`${At.length??""} sites`),ja(os,t(U).enabled),yt.disabled=t(X)}),me(Is,()=>t(l).autoSave,e=>t(l).autoSave=e),xt(dt,()=>t(l).autoSaveInterval,e=>t(l).autoSaveInterval=e),me(Us,()=>t(l).showOrphanPrompt,e=>t(l).showOrphanPrompt=e),me(Os,()=>t(l).confirmContextSwitch,e=>t(l).confirmContextSwitch=e),me(Rs,()=>t(l).restoreWindowPositions,e=>t(l).restoreWindowPositions=e),me(jt,()=>t(l).useSmartPositioning,e=>t(l).useSmartPositioning=e),me(js,()=>t(l).lazyLoadTabs,e=>t(l).lazyLoadTabs=e),xt(Yt,()=>t(l).theme,e=>t(l).theme=e),xt(_t,()=>t(l).syncBackend,e=>t(l).syncBackend=e),r(be,Lt),Va()}Ra(["change","click","keydown"]);Wa(en,{target:document.getElementById("app")});