| 21 | `,"utf-8"))}catch{}}function At(a){let e=Hr();for(let t of a)t.installed=e.has(t.name);return a}function ss(a,e=12e4){return new Promise(t=>{(0,es.exec)(a,{encoding:"utf-8",timeout:e,env:{...process.env,PATH:EO(),NO_COLOR:"1"},shell:qe?"cmd.exe":void 0},(s,i)=>{let r=String(i??"");!s||r.includes("Done")||r.includes("Installed")||r.includes("Removed")||r.includes("Updated")?t({success:!0,output:r}):t({success:!1,output:s?.message??"Command failed"})})})}async function Jr(a,e,t={}){let s=e.length>0?`-a ${e.join(" ")}`:"-a '*'",i=t.globalInstall?"-g":"",r=t.skillName?`-s ${t.skillName}`:"",o=`${as(t.runner||"auto")} skills add ${a} ${s} ${i} ${r} -y`.replace(/\s+/g," ").trim();return ss(o)}async function Kr(a,e="auto"){let s=`${as(e)} skills remove ${a} -y`,i=await ss(s,3e4);return LO(a),{success:!0,output:i.output||`Cleaned ${a}`}}async function en(a="auto"){let t=`${as(a)} skills update`,s=await ss(t),i=s.output.match(/Updated (\d+) skill/);return{...s,count:i?parseInt(i[1]):0}}function is(a){return a>=1e6?`${(a/1e6).toFixed(1)}M`:a>=1e3?`${(a/1e3).toFixed(1)}K`:String(a)}var We=require("fs"),an=require("path"),sn=require("os"),DO=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","WebSearch","WebFetch","TodoRead","TodoWrite","Task","Agent","Skill","LSP","NotebookEdit","AskFollowupQuestion","AttemptCompletion","SearchReplace","InsertCodeBlock","ReadImages","ExecuteCommand","ListFiles","SearchFiles","ReadFile","WriteFile","ReplaceInFile","ListCodeDefinitionNames","BrowserAction","UseMcp","shell","shell_command","update_plan","create_plan","read_file","write_file","execute_command","spawn_agent","write_stdin","multi_tool_use.parallel"]);function tn(a){return!(DO.has(a)||a.startsWith("mcp__")||a.startsWith("mcp_"))}function zO(a){let e=a.top_skills.filter(s=>tn(s.name)),t=a.top_skills.filter(s=>!tn(s.name)).reduce((s,i)=>s+i.total,0);return{...a,top_skills:e,total_invocations:Math.max(0,a.total_invocations-t),unique_skills:e.length}}function AO(){let a=De("stats"),e=De("health"),t=De("burn"),s=De("context");return{stats:a,health:e,burn:t&&t.length>0?t[0]:null,context:s}}var rs=(0,an.join)((0,sn.homedir)(),".skillkit","dashboard-cache.json"),he=null,xe=null;function MO(){if(!he&&(0,We.existsSync)(rs))try{let a=JSON.parse((0,We.readFileSync)(rs,"utf-8"));he=a.data,xe=a.cachedAt}catch{}}function VO(){if(he)try{(0,We.writeFileSync)(rs,JSON.stringify({data:he,cachedAt:xe},null,2),"utf-8")}catch{}}MO();var Mt=class{containerEl;app;constructor(e,t){this.containerEl=e,this.app=t}render(){if(this.containerEl.empty(),this.containerEl.addClass("as-dashboard"),!K()){this.renderNoSkillkit();return}if(he)this.renderDashboard(he);else{let e=this.containerEl.createDiv("as-dash-loading");e.createDiv("as-dash-spinner"),e.createDiv({cls:"as-dash-loading-text",text:"Loading analytics..."}),window.setTimeout(()=>{let t=AO();he=t,xe=Date.now(),VO(),e.remove(),this.renderDashboard(t)},10)}}renderDashboard(e){this.renderActionBar(e);let t=e.stats?zO(e.stats):null;if(t&&this.renderOverview(t,e.health),t&&this.renderTopSkills(t),e.health||e.context){let s=this.containerEl.createDiv("as-dash-row");e.health&&this.renderHealth(e.health,s),e.context&&this.renderContext(e.context,s)}e.burn&&this.renderBurn(e.burn),e.health&&this.renderStale(e.health)}renderActionBar(e){let t=this.containerEl.createDiv("as-dash-action-bar");if(xe){let n=Math.round((Date.now()-xe)/1e3),o=n<5?"just now":n<60?`${n}s ago`:`${Math.round(n/60)}m ago`;t.createSpan({cls:"as-dash-updated",text:`Updated ${o}`})}let s=t.createDiv("as-dash-action-buttons"),i=s.createEl("button",{cls:"as-action-btn",text:"Update skills"});i.addEventListener("click",()=>{i.setText("Updating..."),i.disabled=!0,en().then(n=>{if(n.success){let o=n.count>0?`Updated ${n.count} skill(s)`:"All skills up to date";new ue.Notice(o,5e3),he=null,xe=null,this.render()}else new ue.Notice(`Update failed: ${n.output}`,5e3);i.setText("Update skills"),i.disabled=!1})});let r=s.createEl("button",{cls:"as-action-btn",text:"Scan sessions"});if(r.addEventListener("click",()=>{r.setText("Scanning..."),r.disabled=!0,window.setTimeout(()=>{let n=ze("scan");n.success?(new ue.Notice("Scan complete",5e3),he=null,xe=null,this.render()):new ue.Notice(`Scan failed: ${n.output}`,5e3),r.setText("Scan sessions"),r.disabled=!1},10)}),e.health&&e.health.usage.unused_30d>0){let n=s.createEl("button",{cls:"as-action-btn as-action-btn-danger",text:`Prune ${e.health.usage.unused_30d} stale`});n.addEventListener("click",()=>{_e(this.app,"Prune stale skills",`Remove ${e.health.usage.unused_30d} unused skills? This cannot be undone.`,()=>{n.setText("Pruning..."),n.disabled=!0,window.setTimeout(()=>{let o=ze("prune --yes");o.success?(new ue.Notice("Pruned stale skills",5e3),he=null,xe=null,this.render()):new ue.Notice(`Prune failed: ${o.output}`,5e3),n.setText(`Prune ${e.health.usage.unused_30d} stale`),n.disabled=!1},10)})})}}renderNoSkillkit(){let e=this.containerEl.createDiv("as-dash-empty"),t=e.createDiv("as-dash-empty-icon");(0,ue.setIcon)(t,"bar-chart-2"),e.createEl("h3",{text:"Dashboard requires skillkit"}),e.createEl("p",{text:"Install skillkit to unlock usage analytics, burn rate, context tax, and more."}),e.createDiv("as-dash-install-cmd").createEl("code",{text:"npm i -g @crafter/skillkit && skillkit scan"}),e.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",r=>{r.preventDefault(),ut("https://www.npmjs.com/package/@crafter/skillkit")})}renderOverview(e,t){let s=this.containerEl.createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Overview"});let i=s.createDiv("as-dash-stats");if(this.statCard(i,String(e.total_invocations),"invocations","activity"),this.statCard(i,String(e.unique_skills),"active skills","sparkles"),this.statCard(i,String(t?.installed??0),"installed","package"),this.statCard(i,String(t?.usage.unused_30d??0),"stale","alert-triangle"),e.streak&&e.streak.current>0){let r=s.createDiv("as-dash-streak-row");r.createSpan({cls:"as-streak-value",text:`${e.streak.current} day streak`}),e.streak.current>=7&&r.createSpan({cls:"as-streak-fire",text:"on fire"}),r.createSpan({cls:"as-streak-longest",text:`longest: ${e.streak.longest}d`})}if(e.velocity&&e.velocity.this_week>0){let r=s.createDiv("as-dash-velocity-row");r.createSpan({text:`This week: $${e.velocity.this_week.toFixed(0)}`}),r.createSpan({cls:"as-velocity-vs",text:`vs $${e.velocity.last_week.toFixed(0)} last week`});let n=e.velocity.change_pct,o=n>0?"as-velocity-up":n<0?"as-velocity-down":"",l=n>0?"+":"";r.createSpan({cls:`as-velocity-change ${o}`,text:`${l}${n.toFixed(0)}%`})}}statCard(e,t,s,i){let r=e.createDiv("as-stat-card"),n=r.createDiv("as-stat-icon");(0,ue.setIcon)(n,i),r.createDiv({cls:"as-stat-value",text:t}),r.createDiv({cls:"as-stat-label",text:s})}renderTopSkills(e){if(e.top_skills.length===0)return;let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Top Skills (${e.period.days}d)`});let s=e.top_skills[0]?.total||1,i=t.createDiv("as-dash-bars");for(let r of e.top_skills.slice(0,10)){let n=i.createDiv("as-bar-row");n.createSpan({cls:"as-bar-name",text:r.name}),n.createDiv("as-bar-wrap").createDiv("as-bar-fill").setCssProps({"--bar-w":`${r.total/s*100}%`}),n.createSpan({cls:"as-bar-count",text:String(r.total)})}}renderHealth(e,t){let s=(t||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Health"});let i=e.usage.used_30d+e.usage.unused_30d,r=i>0?Math.round(e.usage.used_30d/i*100):0,n=s.createDiv("as-dash-health-row"),o=n.createDiv("as-donut");o.setCssProps({"--pct":`${r}`}),o.createDiv({cls:"as-donut-label",text:`${r}%`}),o.createDiv({cls:"as-donut-sub",text:"active"});let l=n.createDiv("as-health-details");l.createDiv({cls:"as-health-line",text:`${e.usage.used_30d} used in 30d`}),l.createDiv({cls:"as-health-line as-health-warn",text:`${e.usage.unused_30d} never triggered`});let c=l.createDiv("as-budget-bar").createDiv("as-budget-fill");c.setCssProps({"--bar-w":`${e.metadata.pct}%`}),e.metadata.pct>80&&c.addClass("as-budget-over"),l.createDiv({cls:"as-health-line",text:`Metadata budget: ${e.metadata.pct}%`})}renderBurn(e){let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Burn Rate \u2014 ${e.agent} (${e.period.days}d)`});let s=t.createDiv("as-dash-stats as-dash-stats-sm");if(this.statCard(s,`$${Math.round(e.cost.total).toLocaleString()}`,"total cost","flame"),this.statCard(s,`$${Math.round(e.cost.total/(e.period.days||1)).toLocaleString()}`,"daily avg","trending-up"),this.statCard(s,`${(e.period.sessions||0).toLocaleString()}`,"sessions","terminal"),this.statCard(s,`${((e.period.api_calls||0)/1e3).toFixed(0)}k`,"API calls","zap"),e.by_model&&e.by_model.length>0){let o=t.createDiv("as-model-breakdown");for(let l of e.by_model.slice(0,4)){let O=o.createDiv("as-model-row");O.createSpan({cls:"as-model-name",text:l.model}),O.createSpan({cls:"as-model-calls",text:`${l.apiCalls.toLocaleString()} calls`}),l.costUsd>0&&O.createSpan({cls:"as-model-cost",text:`$${Math.round(l.costUsd).toLocaleString()}`})}}let i=e.by_day.slice(-14);if(i.length===0)return;let r=Math.max(...i.map(o=>o.costUsd),1),n=t.createDiv("as-burn-chart");for(let o of i){let l=n.createDiv("as-burn-col"),O=l.createDiv("as-burn-bar"),c=Math.max(2,o.costUsd/r*100);O.setCssProps({"--bar-h":`${c}%`}),O.title=`${o.date}: $${o.costUsd.toFixed(0)}`,l.createDiv({cls:"as-burn-date",text:o.date.slice(8)})}}renderContext(e,t){let s=(t||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Context Tax"});let i=e.always_loaded.total_tokens,r=[{label:"CLAUDE.md",tokens:e.always_loaded.claude_md_tokens,cls:"as-ctx-claude"},{label:"Skills metadata",tokens:e.always_loaded.skill_metadata_tokens,cls:"as-ctx-skills"},{label:"Memory",tokens:e.always_loaded.memory_tokens,cls:"as-ctx-memory"}],n=s.createDiv("as-ctx-bar");for(let O of r){let c=n.createDiv(`as-ctx-part ${O.cls}`);c.setCssProps({"--bar-w":`${O.tokens/i*100}%`}),c.title=`${O.label}: ${(O.tokens/1e3).toFixed(1)}k tokens`}let o=s.createDiv("as-ctx-legend");for(let O of r){let c=o.createDiv("as-ctx-legend-item");c.createSpan({cls:`as-ctx-dot ${O.cls}`}),c.createSpan({text:`${O.label}: ${(O.tokens/1e3).toFixed(1)}k`})}let l=s.createDiv("as-ctx-costs");l.createDiv({text:`Per session (cached): $${e.session_estimate.with_cache.toFixed(2)}`}),l.createDiv({text:`Without cache: $${e.session_estimate.without_cache.toFixed(2)}`}),l.createDiv({cls:"as-ctx-savings",text:`Cache saves ${e.session_estimate.savings_pct.toFixed(0)}%`})}renderStale(e){if(e.usage.never_used.length===0)return;let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Stale skills (${e.usage.unused_30d})`});let s=t.createDiv("as-stale-list");for(let i of e.usage.never_used.slice(0,20))s.createDiv("as-stale-item").createSpan({text:i});e.usage.never_used.length>20&&s.createDiv({cls:"as-stale-more",text:`+${e.usage.never_used.length-20} more`})}};var de=require("obsidian"),Ge=require("fs"),hn=require("path"),mn=require("os");var Oe=require("obsidian"),Ie=require("fs"),pn=require("path"),un=require("os");var C=require("fs"),R=require("path"),Vt=require("os"),nn=require("obsidian"),on=require("crypto");var rn=new Set(["readme.md","license","license.md","changelog.md",".ds_store","thumbs.db"]);function qO(a){return(0,on.createHash)("sha256").update(a).digest("hex").slice(0,12)}function WO(a){let e=a.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!e)return{frontmatter:{},content:a};try{let t=(0,nn.parseYaml)(e[1]);return{frontmatter:typeof t=="object"&&t?t:{},content:e[2]}}catch{return{frontmatter:{},content:a}}}function IO(a,e,t,s="auto",i="skill"){if(i==="command")return typeof a.name=="string"&&a.name?a.name:(0,R.basename)(t,(0,R.extname)(t));if(s==="auto"){if(typeof a.name=="string"&&a.name)return a.name;let n=e.match(/^#\s+(.+)$/m);if(n)return n[1].trim()}let r=(0,R.basename)(t,(0,R.extname)(t));return r==="SKILL"?(0,R.basename)((0,R.join)(t,"..")):r}function ln(a,e,t,s="auto",i=0){if(!(0,C.existsSync)(a)||i>3)return[];let r=[];for(let n of(0,C.readdirSync)(a,{withFileTypes:!0})){let o=(0,R.join)(a,n.name);if(!(n.isDirectory()||n.isSymbolicLink()&&(0,C.statSync)(o,{throwIfNoEntry:!1})?.isDirectory()))continue;let O=(0,R.join)(o,"SKILL.md");if((0,C.existsSync)(O)){let c=ct(O,e,t,"directory-with-skillmd",s);c&&r.push(c)}else r.push(...ln(o,e,t,s,i+1))}return r}function GO(a,e,t,s="auto"){if(!(0,C.existsSync)(a))return[];let i=[];for(let r of(0,C.readdirSync)(a,{withFileTypes:!0})){let n=(0,R.join)(a,r.name);if(r.isDirectory()||r.isSymbolicLink()&&(0,C.statSync)(n,{throwIfNoEntry:!1})?.isDirectory()){let c=(0,R.join)(n,"SKILL.md");if((0,C.existsSync)(c)){let u=ct(c,e,t,"flat-md",s);u&&i.push(u);continue}let d=(0,C.readdirSync)(n).filter(u=>u.endsWith(".md")&&!rn.has(u.toLowerCase())),p=d.find(u=>u.toLowerCase()===`${r.name.toLowerCase()}.md`)||d[0];if(p){let u=ct((0,R.join)(n,p),e,t,"flat-md",s);u&&i.push(u)}continue}let l=r.name.toLowerCase();if(!l.endsWith(".md")||rn.has(l))continue;let O=ct(n,e,t,"flat-md",s);O&&i.push(O)}return i}function UO(a,e,t,s="auto"){if(!(0,C.existsSync)(a))return[];let i=[];for(let r of(0,C.readdirSync)(a,{withFileTypes:!0})){if(!r.name.endsWith(".mdc")&&!r.name.endsWith(".md")||r.isDirectory())continue;let n=ct((0,R.join)(a,r.name),e,t,"mdc",s);n&&i.push(n)}return i}function ct(a,e,t,s="directory-with-skillmd",i="auto"){try{let r=(0,C.readFileSync)(a,"utf-8"),n=(0,C.statSync)(a),{frontmatter:o,content:l}=WO(r),O=IO(o,l,a,i,e),c=typeof o.description=="string"?o.description:"",d;try{d=(0,C.realpathSync)(a)}catch{d=a}return{id:qO(d),name:O,description:c,type:e,tools:[t],filePath:a,realPath:d,dirPath:(0,R.join)(a,".."),content:r,frontmatter:o,lastModified:n.mtimeMs,fileSize:n.size,isFavorite:!1,collections:[]}}catch{return null}}function ns(a,e,t="auto"){switch(a.pattern){case"directory-with-skillmd":return ln(a.baseDir,a.type,e,t);case"flat-md":return GO(a.baseDir,a.type,e,t);case"mdc":return UO(a.baseDir,a.type,e,t)}}function NO(a,e){let t=[],s=[{sub:".claude/skills",type:"skill",pattern:"directory-with-skillmd"},{sub:".claude/commands",type:"command",pattern:"flat-md"},{sub:".claude/agents",type:"agent",pattern:"flat-md"},{sub:".cursor/skills",type:"skill",pattern:"directory-with-skillmd"},{sub:".codex/skills",type:"skill",pattern:"directory-with-skillmd"}];for(let i of s){let r=(0,R.join)(a,i.sub);if(!(0,C.existsSync)(r))continue;let n={baseDir:r,type:i.type,pattern:i.pattern};t.push(...ns(n,e))}return t}function On(a){return a.projectsHomeDir||(0,Vt.homedir)()}function BO(a,e){let t=(0,Vt.homedir)(),s=[];for(let i of[...e.paths,...e.agentPaths]){let r=(0,R.relative)(t,i.baseDir);if(r.startsWith("..")||r.startsWith("/"))continue;let n=(0,R.join)(a,r);if((0,C.existsSync)(n))try{s.push(...ns({...i,baseDir:n},e.id))}catch{}}return s}function FO(a){let e=On(a);if(!(0,C.existsSync)(e))return[];let t=[];try{let s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);for(let i of(0,C.readdirSync)(e,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let r=(0,R.join)(e,i.name);for(let n of W){if(!n.isInstalled())continue;let o=a.tools[n.id];if(o&&!o.enabled)continue;let l=BO(r,n);l.length>0&&t.push({items:l,toolId:n.id})}}}catch{}return t}function os(a,e){let t=e||(0,Vt.homedir)();if(!a.startsWith(t+R.sep))return"global";let i=a.slice(t.length+1).split(R.sep);return i.length>1&&!i[0].startsWith(".")?i[0]:"global"}function cn(a){$s();let e=a.namingMode||"auto",t=new Map,s=new Map;function i(r,n){let o=t.get(r.id);if(o){o.tools.includes(n)||o.tools.push(n);return}let l=s.get(r.name);if(l){let O=t.get(l);O&&!O.tools.includes(n)&&O.tools.push(n);return}r.isFavorite=a.favorites.includes(r.id);for(let[O,c]of Object.entries(a.collections))c.includes(r.id)&&r.collections.push(O);t.set(r.id,r),s.set(r.name,r.id)}for(let r of W){if(!r.isInstalled())continue;let n=a.tools[r.id];if(n&&!n.enabled)continue;let o=[...r.paths,...r.agentPaths];for(let l of o)for(let O of ns(l,r.id,e))i(O,r.id)}for(let r of a.customScanPaths)if((0,C.existsSync)(r))for(let n of NO(r,"claude-code"))i(n,"claude-code");if(a.projectScanEnabled)for(let{items:r,toolId:n}of FO(a))for(let o of r)i(o,n);return t}function ls(){return W.filter(a=>a.isInstalled()).map(a=>a.id)}function dn(a){let e=[];for(let t of W)if(t.isInstalled())for(let s of[...t.paths,...t.agentPaths])(0,C.existsSync)(s.baseDir)&&e.push(s.baseDir);if(a?.projectScanEnabled){let t=On(a),s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);try{for(let i of(0,C.readdirSync)(t,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let r=(0,R.join)(t,i.name);for(let n of[".claude/skills",".claude/commands",".claude/agents",".cursor/skills",".codex/skills"]){let o=(0,R.join)(r,n);(0,C.existsSync)(o)&&e.push(o)}}}catch{}}return e}var Os={};for(let[a,e]of Object.entries(zt))Os[e]||(Os[e]=a);var cs=(0,pn.join)((0,un.homedir)(),".skillkit","install-prefs.json"),Re=null,qt=!0;function HO(){if(!Re&&(0,Ie.existsSync)(cs))try{let a=JSON.parse((0,Ie.readFileSync)(cs,"utf-8"));Re=new Set(a.agents||[]),qt=a.globalInstall??!0}catch{}}function JO(){try{(0,Ie.writeFileSync)(cs,JSON.stringify({agents:Re?[...Re]:[],globalInstall:qt}),"utf-8")}catch{}}HO();var Wt=class extends Oe.Modal{skill;settings;onInstalled;selectedAgents;isGlobal;constructor(e,t,s,i){if(super(e),this.skill=t,this.settings=s,this.onInstalled=i,Re)this.selectedAgents=new Set(Re);else{this.selectedAgents=new Set;let r=ls();for(let n of r){let o=zt[n];o&&this.selectedAgents.add(o)}}this.isGlobal=qt}onOpen(){let{contentEl:e}=this;e.addClass("as-install-modal"),e.createEl("h3",{text:`Install ${this.skill.name}`}),e.createEl("p",{cls:"as-install-source",text:this.skill.source}),new Oe.Setting(e).setName("Install globally").setDesc("Shared across all projects (~/.agents/skills/)").addToggle(l=>l.setValue(this.isGlobal).onChange(O=>{this.isGlobal=O})),new Oe.Setting(e).setName("Agents").setHeading();let t=e.createDiv("as-install-scroll"),s=ls(),i=new Set(s.map(l=>zt[l]).filter(Boolean));for(let l of Fr){let O=i.has(l.id),c=Os[l.id],p=new Oe.Setting(t).addToggle(f=>f.setValue(this.selectedAgents.has(l.id)).onChange(w=>{w?this.selectedAgents.add(l.id):this.selectedAgents.delete(l.id)})).nameEl,u=c&&I[c]?c:I[l.id]?l.id:I[l.id+"-code"]?l.id+"-code":I[l.id+"-cli"]?l.id+"-cli":null,g=p.createSpan("as-install-agent-icon");u?ne(g,u,14):g.addClass("as-install-agent-placeholder"),p.createSpan({text:l.label}),O&&p.createSpan({cls:"as-install-detected",text:"detected"})}let r=e.createDiv("as-install-footer");r.createEl("button",{text:"Cancel"}).addEventListener("click",()=>this.close()),r.createEl("button",{cls:"mod-cta",text:"Install"}).addEventListener("click",()=>this.doInstall())}doInstall(){let e=[...this.selectedAgents];if(e.length===0){new Oe.Notice("Select at least one agent",5e3);return}Re=new Set(this.selectedAgents),qt=this.isGlobal,JO(),this.close(),new Oe.Notice(`Installing ${this.skill.name}...`,3e3),Jr(this.skill.source,e,{runner:this.settings.packageRunner,globalInstall:this.isGlobal,skillName:this.skill.name}).then(t=>{t.success?(new Oe.Notice(`Installed ${this.skill.name}`,5e3),this.skill.installed=!0,this.onInstalled()):new Oe.Notice(`Failed to install ${this.skill.name}`,5e3)})}onClose(){this.contentEl.empty()}};var ds=(0,hn.join)((0,mn.homedir)(),".skillkit","marketplace-popular.json"),ce=null,It="",Ze=null,KO=new de.Component;function ec(){if(!ce&&(0,Ge.existsSync)(ds))try{let a=JSON.parse((0,Ge.readFileSync)(ds,"utf-8"));ce=At(a)}catch{}}function tc(){if(ce)try{(0,Ge.writeFileSync)(ds,JSON.stringify(ce),"utf-8")}catch{}}ec();var Gt=class{containerEl;inputEl=null;listEl=null;previewEl=null;searchTimer=null;selectedSkill=null;app;settings;onRefresh;constructor(e,t,s,i){this.containerEl=e,this.app=t.app,this.settings=s,this.onRefresh=i}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-marketplace");let e=this.containerEl.createDiv("as-mp-search");this.inputEl=e.createEl("input",{type:"text",placeholder:"Search skills on skills.sh...",cls:"as-mp-search-input"}),this.inputEl.addEventListener("input",()=>{this.searchTimer&&window.clearTimeout(this.searchTimer),this.searchTimer=window.setTimeout(()=>{this.doSearch(this.inputEl.value)},300)});let t=this.containerEl.createDiv("as-mp-body");this.listEl=t.createDiv("as-mp-list"),this.previewEl=t.createDiv("as-mp-preview"),this.previewEl.createDiv({cls:"as-mp-hint",text:"Select a skill to preview."})}this.inputEl.value=It,It.length>=2&&Ze?this.showResults(Ze):ce?this.showPopular():this.loadPopular()}async loadPopular(){if(!this.listEl)return;this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Loading popular skills..."}),ce=await Br(),tc(),this.showPopular()}refreshList(){ce&&At(ce),Ze&&At(Ze),It.length>=2&&Ze?this.showResults(Ze):this.showPopular()}showPopular(){if(this.listEl){if(this.listEl.empty(),!ce||ce.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"Search for skills to browse and install."});return}this.listEl.createDiv({cls:"as-mp-section-title",text:"Popular"});for(let e of ce)this.renderSkillCard(e)}}showResults(e){if(this.listEl){if(this.listEl.empty(),e.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"No skills found."});return}for(let t of e)this.renderSkillCard(t)}}async doSearch(e){if(!this.listEl)return;if(It=e,e.length<2){Ze=null,this.showPopular();return}this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Searching..."});let t=await ts(e);Ze=t,this.showResults(t)}renderSkillCard(e){if(!this.listEl)return;let t=this.listEl.createDiv("as-mp-card");this.selectedSkill?.id===e.id&&t.addClass("is-selected");let s=t.createDiv("as-mp-card-header");s.createSpan({cls:"as-mp-card-name",text:e.name}),e.installed&&s.createSpan({cls:"as-mp-installed-badge",text:"Installed"}),t.createDiv({cls:"as-mp-card-source",text:e.source});let i=t.createDiv("as-mp-card-meta"),r=i.createSpan("as-mp-dl-icon");(0,de.setIcon)(r,"download"),i.createSpan({cls:"as-mp-card-installs",text:is(e.installs)}),t.addEventListener("click",()=>{this.selectedSkill=e,this.listEl&&this.listEl.querySelectorAll(".as-mp-card").forEach(n=>n.removeClass("is-selected")),t.addClass("is-selected"),this.showPreview(e)})}async showPreview(e){if(!this.previewEl)return;this.previewEl.empty();let s=this.previewEl.createDiv("as-mp-preview-header").createDiv("as-mp-preview-top"),i=s.createDiv("as-mp-preview-left");i.createDiv({cls:"as-mp-preview-name",text:e.name});let r=i.createDiv("as-mp-preview-meta");r.createSpan({cls:"as-mp-preview-source",text:e.source});let n=r.createSpan("as-mp-dl-icon");(0,de.setIcon)(n,"download"),r.createSpan({cls:"as-mp-preview-installs",text:is(e.installs)});let o=s.createDiv("as-mp-preview-right");if(!e.installed)this.renderInstallButton(o,e);else{o.createSpan({cls:"as-mp-installed-label",text:"Installed"});let c=o.createEl("button",{cls:"as-mp-uninstall-btn",text:"Uninstall"});c.addEventListener("click",()=>{_e(this.app,"Uninstall skill",`Remove "${e.name}" from all agents?`,()=>{c.setText("Removing..."),c.disabled=!0,new de.Notice(`Removing ${e.name}...`,3e3),Kr(e.name,this.settings.packageRunner).then(d=>{d.success?(new de.Notice(`Removed ${e.name}`,5e3),e.installed=!1,this.refreshList(),this.showPreview(e)):(new de.Notice(`Failed to remove ${e.name}`,5e3),c.setText("Uninstall"),c.disabled=!1)})})})}let l=this.previewEl.createDiv("as-mp-preview-content");l.createDiv({cls:"as-mp-loading",text:"Loading skill content..."});let O=await Nr(e.source,e.name,e.id);if(l.empty(),O){e.content=O;let c=l.createDiv("as-mp-rendered markdown-rendered");de.MarkdownRenderer.render(this.app,O,c,"",KO)}else l.createDiv({cls:"as-mp-hint",text:"Could not load skill content."})}renderInstallButton(e,t){e.createEl("button",{cls:"as-mp-install-btn",text:"Install"}).addEventListener("click",()=>{new Wt(this.app,t,this.settings,()=>{this.refreshList(),this.showPreview(t)}).open()})}};var me=require("obsidian"),fe=require("fs"),Ut=require("path");function ac(){let a=[];for(let e of W){if(!e.isInstalled())continue;let t=[];for(let s of[...e.paths,...e.agentPaths])s.type==="rule"||s.type==="memory"||t.push({sp:s,label:s.type});t.length>0&&a.push({tool:e,paths:t})}return a}var sc={skill:"sparkles",command:"terminal",agent:"bot"},Nt=class extends me.Modal{onCreated;toolOptions;selectedTool=null;selectedPath=null;name="";step="tool";constructor(e,t){super(e),this.onCreated=t,this.toolOptions=ac()}onOpen(){this.modalEl.addClass("as-create-modal"),this.render()}render(){let{contentEl:e}=this;e.empty(),this.step==="tool"?this.renderToolStep(e):this.step==="type"?this.renderTypeStep(e):this.renderNameStep(e)}renderToolStep(e){this.renderHeader(e,"Choose tool",null);let t=e.createDiv("as-create-grid");for(let s of this.toolOptions){let i=t.createDiv("as-create-card");i.style.setProperty("--tool-color",s.tool.color);let r=i.createDiv("as-create-card-icon");I[s.tool.id]&&ne(r,s.tool.id,24),i.createDiv({cls:"as-create-card-name",text:s.tool.name}),i.addEventListener("click",()=>{this.selectedTool=s,s.paths.length===1?(this.selectedPath=s.paths[0],this.step="name"):this.step="type",this.render()})}}renderTypeStep(e){if(!this.selectedTool)return;this.renderHeader(e,`${this.selectedTool.tool.name}`,()=>{this.step="tool",this.render()}),e.createDiv("as-create-subtitle").setText("What do you want to create?");let s=e.createDiv("as-create-type-grid");for(let i of this.selectedTool.paths){let r=s.createDiv("as-create-type-card");r.style.setProperty("--tool-color",this.selectedTool.tool.color);let n=sc[i.label]||"file",o=r.createDiv("as-create-type-icon");(0,me.setIcon)(o,n),r.createDiv({cls:"as-create-type-label",text:i.label}),r.addEventListener("click",()=>{this.selectedPath=i,this.step="name",this.render()})}}renderNameStep(e){if(!this.selectedTool||!this.selectedPath)return;let t=this.selectedTool.paths.length>1?"type":"tool";this.renderHeader(e,`New ${this.selectedPath.label}`,()=>{this.step=t,this.render()});let s=e.createDiv("as-create-badge");s.style.setProperty("--tool-color",this.selectedTool.tool.color);let i=s.createSpan("as-create-badge-icon");I[this.selectedTool.tool.id]&&ne(i,this.selectedTool.tool.id,14),s.createSpan({text:this.selectedTool.tool.name});let n=e.createDiv("as-create-input-wrap").createEl("input",{type:"text",placeholder:`my-${this.selectedPath.label}-name`,cls:"as-create-input"});n.value=this.name,n.addEventListener("input",()=>{this.name=n.value.trim()}),n.addEventListener("keydown",O=>{O.key==="Enter"&&this.name&&this.create()}),window.setTimeout(()=>n.focus(),10);let l=e.createDiv("as-create-actions").createEl("button",{text:`Create ${this.selectedPath.label}`,cls:"as-create-submit"});l.style.setProperty("--tool-color",this.selectedTool.tool.color),l.addEventListener("click",()=>this.create())}renderHeader(e,t,s){let i=e.createDiv("as-create-header");if(s){let r=i.createDiv("as-create-back");(0,me.setIcon)(r,"chevron-left"),r.addEventListener("click",s)}i.createDiv({cls:"as-create-title",text:t})}create(){if(!this.name||!this.selectedPath)return;let e=this.name.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"");if(!e){new me.Notice("Invalid name");return}let t=this.selectedPath.sp,s;if(t.pattern==="directory-with-skillmd"){let i=(0,Ut.join)(t.baseDir,e);if((0,fe.existsSync)(i)){new me.Notice(`Already exists: ${e}`);return}(0,fe.mkdirSync)(i,{recursive:!0}),s=(0,Ut.join)(i,"SKILL.md"),(0,fe.writeFileSync)(s,["---",`name: ${this.name}`,'description: ""',"---","",`# ${this.name}`,"","## Instructions","",""].join(` |
| 25 | `).filter(O=>O.trim());if(t.length===0)return null;let s=t.length>ms?t.slice(0,ms):t,{messages:i,firstTimestamp:r,lastTimestamp:n}=oc(s);if(i.length===0)return null;let o=i.find(O=>O.role==="human"),l=o?o.text.slice(0,120).replace(/\n/g," "):"(empty conversation)";return{id:a.uuid,uuid:a.uuid,project:a.project,projectPath:a.projectPath,title:l,messages:i,messageCount:i.length,firstTimestamp:r,lastTimestamp:n,tags:[],customTags:[],isFavorite:!1,filePath:a.filePath}}catch{return null}}async function cc(a){return new Promise(e=>{let t=[],s="",i="",r=0,n=(0,fn.createInterface)({input:(0,re.createReadStream)(a.filePath,{encoding:"utf-8"}),crlfDelay:Number.POSITIVE_INFINITY});n.on("line",o=>{if(o.trim()){if(r++,r>ms){n.close();return}try{let l=JSON.parse(o),O=typeof l.timestamp=="string"?l.timestamp:void 0;if(O&&(s||(s=O),i=O),l.type==="user"){let c=l.message;if(!c)return;let d=Bt(c.content);d&&t.push({role:"human",text:d,timestamp:O||""})}if(l.type==="assistant"){let c=l.message;if(!c)return;let d=Bt(c.content),p=gn(c.content);d&&t.push({role:"assistant",text:d,timestamp:O||"",toolCalls:p.length>0?p:void 0})}}catch{}}}),n.on("close",()=>{if(t.length===0){e(null);return}let o=t.find(O=>O.role==="human"),l=o?o.text.slice(0,120).replace(/\n/g," "):"(empty conversation)";e({id:a.uuid,uuid:a.uuid,project:a.project,projectPath:a.projectPath,title:l,messages:t,messageCount:t.length,firstTimestamp:s,lastTimestamp:i,tags:[],customTags:[],isFavorite:!1,filePath:a.filePath})}),n.on("error",()=>e(null))})}async function Qn(){let a=lc(),e=[],t=20;a.sort((s,i)=>i.fileSize-s.fileSize);for(let s=0;s<a.length;s+=t){let i=a.slice(s,s+t),r=await Promise.all(i.map(n=>n.fileSize>rc?cc(n):Promise.resolve(Oc(n))));for(let n of r)n&&e.push(n)}return e.sort((s,i)=>(i.lastTimestamp||"").localeCompare(s.lastTimestamp||"")),e}var dc=[{tag:"react",patterns:[/\breact\b/i,/\.tsx\b/,/\.jsx\b/,/usestate|useeffect|useref/i]},{tag:"react-native",patterns:[/react.native/i,/\bexpo\b/i,/react-navigation/i]},{tag:"nextjs",patterns:[/next\.js/i,/\bnextjs\b/i,/next\.config/i]},{tag:"vue",patterns:[/\bvue\b/i,/\.vue\b/,/vuex|pinia/i]},{tag:"angular",patterns:[/\bangular\b/i,/\.component\.ts/i]},{tag:"svelte",patterns:[/\bsvelte\b/i,/\.svelte\b/]},{tag:"typescript",patterns:[/typescript/i,/tsconfig/i,/\.tsx\b/]},{tag:"javascript",patterns:[/javascript/i,/\.js\b/,/\.mjs\b/]},{tag:"python",patterns:[/\bpython\b/i,/\.py\b/,/\bpip\b/i,/django|flask|fastapi/i]},{tag:"rust",patterns:[/\brust\b/i,/\.rs\b/,/cargo\.toml/i]},{tag:"go",patterns:[/\bgolang\b/i,/\.go\b/,/go\.mod/i]},{tag:"java",patterns:[/\bjava\b/i,/\.java\b/,/gradle|maven/i]},{tag:"csharp",patterns:[/\bc#\b/i,/\.cs\b/,/unity|dotnet/i]},{tag:"swift",patterns:[/\bswift\b/i,/\.swift\b/,/swiftui/i]},{tag:"nestjs",patterns:[/nestjs/i,/\bnest\b/i,/@nestjs\//]},{tag:"tailwind",patterns:[/tailwind/i,/tailwindcss/i]},{tag:"css",patterns:[/\.css\b/,/\.scss\b/,/\.sass\b/,/styled-components/i]},{tag:"node",patterns:[/node\.js/i,/\bnodejs\b/i,/package\.json/i,/\bnpm\b/i]},{tag:"docker",patterns:[/\bdocker\b/i,/dockerfile/i,/docker-compose/i]},{tag:"sql",patterns:[/\bsql\b/i,/postgres|mysql|sqlite/i,/prisma|typeorm|sequelize/i]},{tag:"mongodb",patterns:[/\bmongo\b/i,/mongodb/i,/mongoose/i]},{tag:"graphql",patterns:[/graphql/i,/\.graphql\b/,/apollo/i]},{tag:"git",patterns:[/\bgit\s+(commit|push|pull|merge|rebase|checkout|branch)/i]},{tag:"unity",patterns:[/\bunity\b/i,/gameobject|monobehaviour/i,/\.unity\b/]},{tag:"blender",patterns:[/\bblender\b/i,/\.blend\b/,/bpy\./i]},{tag:"threejs",patterns:[/three\.js/i,/threejs/i,/\br3f\b/i,/react-three/i]},{tag:"aws",patterns:[/\baws\b/i,/lambda|s3|ec2|dynamodb/i]},{tag:"firebase",patterns:[/firebase/i,/firestore/i]},{tag:"testing",patterns:[/\bjest\b/i,/\bvitest\b/i,/\.test\.|\.spec\./i,/testing/i]}],pc=[{tag:"bug-fix",patterns:[/\bfix\b/i,/\bbug\b/i,/\berror\b/i,/broken/i,/not working/i,/no funciona/i,/arregl/i]},{tag:"feature",patterns:[/\badd\b/i,/\bcreate\b/i,/\bimplement\b/i,/\bnew\b/i,/agreg/i,/crea /i]},{tag:"refactor",patterns:[/refactor/i,/restructur/i,/reorganiz/i,/clean.?up/i]},{tag:"styling",patterns:[/\bcss\b/i,/\bstyle\b/i,/\bdesign\b/i,/layout/i,/responsive/i,/color/i,/estilo/i]},{tag:"config",patterns:[/config/i,/setup/i,/install/i,/\.env\b/i,/configur/i]},{tag:"api",patterns:[/\bapi\b/i,/endpoint/i,/fetch|axios/i,/request/i,/rest\b/i]},{tag:"auth",patterns:[/auth/i,/login/i,/password/i,/token/i,/session/i,/jwt/i]},{tag:"database",patterns:[/database/i,/migration/i,/schema/i,/seed/i,/query/i]},{tag:"deployment",patterns:[/deploy/i,/ci.?cd/i,/pipeline/i,/production/i,/vercel|netlify|heroku/i]},{tag:"documentation",patterns:[/\bdocs?\b/i,/readme/i,/documentation/i,/comment/i]},{tag:"performance",patterns:[/performance/i,/optimi[zs]/i,/slow/i,/fast/i,/cache/i,/lazy/i]},{tag:"ui-ux",patterns:[/\bui\b/i,/\bux\b/i,/component/i,/button|modal|dialog|form/i,/animation/i]}];function uc(a,e){let t=new RegExp(e.source,e.flags.includes("g")?e.flags:e.flags+"g"),s=a.match(t);return s?s.length:0}function Sn(a,e,t=1){let s=[];for(let i of e){let r=0;for(let n of i.patterns)r+=uc(a,n);r>=t&&s.push(i.tag)}return s}function hc(a){let e=new Set;a.project&&a.project!=="root"&&e.add(a.project);let s=a.messages.filter(n=>n.role==="human").slice(0,5).map(n=>n.text.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g,"")).join(" "),r=a.messages.filter(n=>n.role==="assistant").flatMap(n=>n.toolCalls||[]);for(let n of Sn(s,dc,3))e.add(n);for(let n of Sn(s,pc,2))e.add(n);return r.some(n=>n.includes("mcp__blender"))&&e.add("blender"),r.some(n=>n.includes("mcp-unity")||n.includes("mcp__mcp-unity"))&&e.add("unity"),Array.from(e).sort()}function vn(a){for(let e of a)e.tags=hc(e)}var gs=(0,bn.join)((0,kn.homedir)(),".claude","agentfiles-conversations.json"),Ft=class extends $n.Events{items=[];_filter={kind:"all-conversations"};_sort="date";_dateRange="today";_activeTags=[];_searchQuery="";_loading=!1;tagData={...ps};get filter(){return this._filter}get sort(){return this._sort}get dateRange(){return this._dateRange}get activeTags(){return this._activeTags}get searchQuery(){return this._searchQuery}get loading(){return this._loading}get allItems(){return this.items}get filteredItems(){let e=this.items;switch(this._filter.kind){case"conversation-project":{let t=this._filter.project;e=e.filter(s=>s.project===t);break}case"conversation-tag":{let t=this._filter.tag;e=e.filter(s=>s.tags.includes(t)||s.customTags.includes(t));break}case"conversation-favorites":e=e.filter(t=>t.isFavorite);break}if(this._dateRange!=="all"){let t=Date.now(),s={today:1,"7d":7,"30d":30,"90d":90,"180d":180}[this._dateRange],i=t-s*864e5;e=e.filter(r=>new Date(r.lastTimestamp).getTime()>=i)}if(this._activeTags.length>0&&(e=e.filter(t=>{let s=[...t.tags,...t.customTags];return this._activeTags.every(i=>s.includes(i))})),this._searchQuery){let t=this._searchQuery.toLowerCase();e=e.filter(s=>s.title.toLowerCase().includes(t)||s.project.toLowerCase().includes(t)||s.tags.some(i=>i.includes(t))||s.customTags.some(i=>i.includes(t))||s.messages.some(i=>i.text.toLowerCase().includes(t)))}return this._sort==="messages"&&(e=[...e].sort((t,s)=>s.messageCount-t.messageCount)),e}getProjectCounts(){let e=new Map;for(let t of this.items)e.set(t.project,(e.get(t.project)||0)+1);return e}getAllTags(){let e=new Map;for(let t of this.items)for(let s of[...t.tags,...t.customTags])e.set(s,(e.get(s)||0)+1);return e}refresh(){this._loading=!0,this.trigger("conversations-updated"),this.refreshAsync()}async refreshAsync(){this.loadTagData(),this.items=await Qn(),vn(this.items),this.applyTagData(),this._loading=!1,this.trigger("conversations-updated")}loadTagData(){try{(0,Ue.existsSync)(gs)&&(this.tagData=JSON.parse((0,Ue.readFileSync)(gs,"utf-8")))}catch{this.tagData={...ps}}}saveTagData(){try{(0,Ue.writeFileSync)(gs,JSON.stringify(this.tagData,null,2),"utf-8")}catch{}}applyTagData(){for(let e of this.items)e.customTags=this.tagData.customTags[e.uuid]||[],e.isFavorite=this.tagData.favorites.includes(e.uuid)}setFilter(e){this._filter=e,this.trigger("conversations-updated")}setSort(e){this._sort=e,this.trigger("conversations-updated")}setDateRange(e){this._dateRange=e,this.trigger("conversations-updated")}toggleTag(e){let t=this._activeTags.indexOf(e);t>=0?this._activeTags.splice(t,1):this._activeTags.push(e),this.trigger("conversations-updated")}clearTags(){this._activeTags=[],this.trigger("conversations-updated")}setSearch(e){this._searchQuery=e,this.trigger("conversations-updated")}toggleFavorite(e){let t=this.tagData.favorites.indexOf(e);t>=0?this.tagData.favorites.splice(t,1):this.tagData.favorites.push(e),this.saveTagData();let s=this.items.find(i=>i.uuid===e);s&&(s.isFavorite=!s.isFavorite),this.trigger("conversations-updated")}addCustomTag(e,t){this.tagData.customTags[e]||(this.tagData.customTags[e]=[]);let s=this.tagData.customTags[e];s.includes(t)||s.push(t),this.saveTagData();let i=this.items.find(r=>r.uuid===e);i&&!i.customTags.includes(t)&&i.customTags.push(t),this.trigger("conversations-updated")}removeCustomTag(e,t){this.tagData.customTags[e]&&(this.tagData.customTags[e]=this.tagData.customTags[e].filter(i=>i!==t)),this.saveTagData();let s=this.items.find(i=>i.uuid===e);s&&(s.customTags=s.customTags.filter(i=>i!==t)),this.trigger("conversations-updated")}getItem(e){return this.items.find(t=>t.uuid===e)}};var be=require("obsidian");function mc(a){return a.replace(/<[^>]+>/g,"").replace(/\[Image #?\d*\]/gi,"").replace(/\s+/g," ").trim()||"(untitled)"}function fc(a){if(!a)return"";let e=Date.now()-new Date(a).getTime(),t=Math.floor(e/6e4);if(t<60)return`${t}m ago`;let s=Math.floor(t/60);if(s<24)return`${s}h ago`;let i=Math.floor(s/24);return i<30?`${i}d ago`:`${Math.floor(i/30)}mo ago`}function gc(a){return a?new Date(a).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"}):""}var Ht=class{containerEl;store;onSelect;selectedUuid=null;inputEl=null;toolbarEl=null;listEl=null;constructor(e,t,s){this.containerEl=e,this.store=t,this.onSelect=s}setSelected(e){this.selectedUuid=e}render(){this.inputEl||(this.containerEl.empty(),this.containerEl.addClass("as-list"),this.searchRowEl=this.containerEl.createDiv("as-search"),this.inputEl=this.searchRowEl.createEl("input",{type:"text",placeholder:"Search conversations...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)}),this.toolbarEl=this.containerEl.createDiv("as-conv-toolbar"),this.listEl=this.containerEl.createDiv("as-list-items as-conv-list")),this.inputEl.value=this.store.searchQuery,this.renderSearchActions(),this.renderTagStrip(),this.renderList()}searchRowEl=null;searchActionsEl=null;outsideClickCleanup=null;dateDropdownEl=null;tagDropdownEl=null;openDropdown=null;closeAllDropdowns(){this.openDropdown=null,this.dateDropdownEl?.removeClass("is-open"),this.tagDropdownEl?.removeClass("is-open"),this.outsideClickCleanup&&(this.outsideClickCleanup(),this.outsideClickCleanup=null)}toggleDropdown(e,t){if(this.openDropdown===e){this.closeAllDropdowns();return}this.closeAllDropdowns(),this.openDropdown=e,(e==="date"?this.dateDropdownEl:this.tagDropdownEl)?.addClass("is-open");let i=r=>{t.contains(r.target)||this.closeAllDropdowns()};window.setTimeout(()=>activeDocument.addEventListener("click",i),0),this.outsideClickCleanup=()=>activeDocument.removeEventListener("click",i)}renderSearchActions(){if(!this.searchRowEl)return;this.searchActionsEl&&this.searchActionsEl.remove(),this.searchActionsEl=this.searchRowEl.createDiv("as-conv-search-actions");let e=this.searchActionsEl.createDiv("as-conv-dropdown-wrap"),t=e.createEl("button",{cls:"as-conv-icon-btn"}),s=t.createSpan("as-conv-icon-btn-icon");(0,be.setIcon)(s,"calendar"),this.dateDropdownEl=e.createDiv("as-conv-dropdown"),this.openDropdown==="date"&&this.dateDropdownEl.addClass("is-open");let i=[{label:"Today",value:"today"},{label:"Last 7 days",value:"7d"},{label:"Last 30 days",value:"30d"},{label:"Last 90 days",value:"90d"},{label:"Last 6 months",value:"180d"},{label:"All time",value:"all"}];for(let g of i){let f=this.store.dateRange===g.value,w=this.dateDropdownEl.createDiv(`as-conv-dropdown-item ${f?"is-active":""}`),P=w.createSpan("as-conv-dropdown-check");f&&(0,be.setIcon)(P,"check"),w.createSpan({cls:"as-conv-dropdown-item-label",text:g.label}),w.addEventListener("click",Z=>{Z.stopPropagation(),this.store.setDateRange(g.value),this.closeAllDropdowns()})}t.addEventListener("click",g=>{g.stopPropagation(),this.toggleDropdown("date",e)});let r=this.store.getAllTags(),n=this.store.activeTags,o=r.size>0,l=this.searchActionsEl.createDiv("as-conv-dropdown-wrap"),O=l.createEl("button",{cls:"as-conv-icon-btn"});o||O.addClass("is-disabled"),n.length>0&&O.addClass("has-active");let c=O.createSpan("as-conv-icon-btn-icon");if((0,be.setIcon)(c,"tag"),this.tagDropdownEl=l.createDiv("as-conv-dropdown"),this.openDropdown==="tag"&&this.tagDropdownEl.addClass("is-open"),o){if(n.length>0){let f=this.tagDropdownEl.createDiv("as-conv-dropdown-item as-conv-dropdown-clear"),w=f.createSpan("as-conv-dropdown-item-icon");(0,be.setIcon)(w,"x"),f.createSpan({text:"Clear filters"}),f.addEventListener("click",P=>{P.stopPropagation(),this.store.clearTags()})}let g=Array.from(r.entries()).sort((f,w)=>w[1]-f[1]).slice(0,25);for(let[f,w]of g){let P=n.includes(f),Z=this.tagDropdownEl.createDiv(`as-conv-dropdown-item ${P?"is-active":""}`),Y=Z.createSpan("as-conv-dropdown-check");P&&(0,be.setIcon)(Y,"check"),Z.createSpan({cls:"as-conv-dropdown-item-label",text:f}),Z.createSpan({cls:"as-conv-dropdown-item-count",text:String(w)}),Z.addEventListener("click",ge=>{ge.stopPropagation(),this.store.toggleTag(f)})}}O.addEventListener("click",g=>{g.stopPropagation(),o&&this.toggleDropdown("tag",l)});let d=this.store.sort==="date"?"messages":"date",p=this.searchActionsEl.createEl("button",{cls:"as-conv-icon-btn"}),u=p.createSpan("as-conv-icon-btn-icon");(0,be.setIcon)(u,this.store.sort==="date"?"clock":"hash"),p.setAttribute("aria-label",`Sort by ${d}`),p.addEventListener("click",()=>this.store.setSort(d))}renderTagStrip(){if(!this.toolbarEl)return;this.toolbarEl.empty();let e=this.store.activeTags,t=this.store.filteredItems.length;if(e.length===0&&t===this.store.allItems.length)return;let s=this.toolbarEl.createDiv("as-conv-tag-strip");s.createSpan({cls:"as-conv-result-count",text:`${t} results`});for(let i of e){let r=s.createEl("button",{cls:"as-conv-tag-pill is-active"});r.createSpan({text:i});let n=r.createSpan("as-conv-tag-pill-x");(0,be.setIcon)(n,"x"),r.addEventListener("click",()=>this.store.toggleTag(i))}if(e.length>0){let i=s.createEl("button",{cls:"as-conv-tag-pill as-conv-tag-clear"});i.createSpan({text:"Clear all"}),i.addEventListener("click",()=>this.store.clearTags())}}renderList(){if(!this.listEl)return;if(this.listEl.empty(),this.store.loading){this.listEl.createDiv({cls:"as-list-empty",text:"Loading conversations..."});return}let e=this.store.filteredItems;if(e.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No conversations found"});return}let t="";for(let s of e){let i=gc(s.lastTimestamp);i!==t&&(t=i,this.listEl.createDiv({cls:"as-conv-date-header",text:i})),this.renderCard(this.listEl,s)}}renderCard(e,t){let s=e.createDiv("as-skill-card");t.uuid===this.selectedUuid&&s.addClass("is-selected");let i=s.createDiv("as-skill-header"),r=mc(t.title),n=r.length>60?r.slice(0,60)+"...":r;if(i.createSpan({cls:"as-skill-name",text:n}),t.isFavorite){let O=i.createSpan("as-skill-star");(0,be.setIcon)(O,"star")}let o=[t.project,fc(t.lastTimestamp),`${t.messageCount} msgs`].filter(Boolean).join(" \xB7 ");s.createDiv({cls:"as-skill-desc",text:o});let l=[...t.tags,...t.customTags].filter(O=>O!==t.project);if(l.length>0){let O=s.createDiv("as-skill-meta"),c=3;for(let d of l.slice(0,c)){let p=t.customTags.includes(d);O.createSpan({cls:`as-conv-tag ${p?"as-conv-tag-custom":""}`,text:d})}l.length>c&&O.createSpan({cls:"as-conv-tag as-conv-tag-more",text:`+${l.length-c}`})}s.addEventListener("click",()=>{this.selectedUuid=t.uuid,this.onSelect(t)})}};var z=require("obsidian"),Ne=require("fs"),dt=require("path");function Qs(a){return a?new Date(a).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function Qc(a){return a.replace(/[<>:"/\\|?*]/g,"").replace(/\.{2,}/g,"").replace(/\s+/g,"-").slice(0,80)}function Pn(a,e){let t=a.firstTimestamp?new Date(a.firstTimestamp).toISOString().slice(0,10):"unknown-date",s=Qc(a.title.slice(0,60));return`${e}/Claude Sessions/${t}-${s}.md`}function yn(a){let{selectedMessages:e,conversation:t}=a,s=[...t.tags,...t.customTags],i=s.map(n=>`"${n}"`).join(", "),r=[];if(r.push("---"),r.push(`tags: [claude-session, ${i}]`),r.push(`session: ${t.uuid}`),r.push(`project: ${t.project}`),r.push(`date: ${t.firstTimestamp?new Date(t.firstTimestamp).toISOString().slice(0,10):"unknown"}`),r.push(`messages: ${t.messageCount}`),r.push("---"),r.push(""),r.push(`# ${t.title.slice(0,100)}`),r.push(""),r.push("## Context"),r.push(`- **Project:** ${t.project}`),r.push(`- **Started:** ${Qs(t.firstTimestamp)}`),r.push(`- **Last activity:** ${Qs(t.lastTimestamp)}`),r.push(`- **Messages:** ${t.messageCount}`),s.length>0&&r.push(`- **Tags:** ${s.map(n=>`\`${n}\``).join(" ")}`),r.push(""),e.length>0){r.push("## Key Snippets"),r.push("");for(let n of e){let o=n.role==="human"?"You":"Claude",l=Qs(n.timestamp);r.push(`### ${o} ${l?`(${l})`:""}`),r.push(""),n.role==="human"?r.push(`> ${n.text.replace(/\n/g,` |