MCPcopy Create free account
hub / github.com/Railly/agentfiles / renderBody

Method renderBody

main.js:27–27  ·  view source on GitHub ↗
(e)

Source from the content-addressed store, hash-verified

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,`
26> `)}`):r.push(n.text),r.push("")}}return r.push("## Resume"),r.push(""),r.push("```bash"),r.push(`claude --resume ${t.uuid}`),r.push("```"),r.join(`
27`)}function Sc(a){return a?new Date(a).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}var Jt=class{containerEl;store;app;vaultPath;currentItem=null;selectedMessages=new Set;visibleCount=20;renderComponent=new z.Component;constructor(e,t,s,i){this.containerEl=e,this.store=t,this.app=s,this.vaultPath=i}show(e){this.currentItem=e,this.selectedMessages.clear(),this.visibleCount=20,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let e=this.containerEl.createDiv("as-detail-empty");(0,z.setIcon)(e.createDiv("as-detail-empty-icon"),"message-circle"),e.createDiv({text:"Select a conversation to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let e=this.currentItem;if(!e)return this.clear();this.renderToolbar(e),this.renderBody(e)}renderToolbar(e){let t=this.containerEl.createDiv("as-detail-toolbar"),s=t.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left"),r=e.title.length>100?e.title.slice(0,100)+"...":e.title;i.createSpan({cls:"as-detail-title",text:r});let n=s.createDiv("as-toolbar-right"),o=n.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,z.setIcon)(o,e.isFavorite?"star":"star-off"),o.addEventListener("click",()=>{this.store.toggleFavorite(e.uuid),this.render()});let l=n.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Copy resume command"}});(0,z.setIcon)(l,"terminal"),l.addEventListener("click",()=>{navigator.clipboard.writeText(`claude --resume ${e.uuid}`),new z.Notice("Resume command copied!",3e3)});let O=n.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-primary",attr:{"aria-label":"Save to vault"}});(0,z.setIcon)(O,"download"),O.addEventListener("click",()=>this.saveToVault(e));let c=t.createDiv("as-detail-meta-bar");c.createSpan({cls:"as-meta-item",text:e.project}),c.createSpan({cls:"as-meta-item",text:`${e.messageCount} messages`}),e.firstTimestamp&&c.createSpan({cls:"as-meta-item",text:new Date(e.firstTimestamp).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})});let d=[...e.tags,...e.customTags];if(d.length>0){let p=t.createDiv("as-conv-detail-tags");for(let g of d){let f=e.customTags.includes(g),w=p.createSpan({cls:`as-conv-tag ${f?"as-conv-tag-custom":""}`,text:g});if(f){let P=w.createSpan("as-conv-tag-remove");(0,z.setIcon)(P,"x"),P.addEventListener("click",Z=>{Z.stopPropagation(),this.store.removeCustomTag(e.uuid,g),this.render()})}}let u=p.createSpan("as-conv-tag as-conv-tag-add");(0,z.setIcon)(u,"plus"),u.addEventListener("click",()=>this.promptAddTag(e))}}renderBody(e){let t=this.containerEl.createDiv("as-detail-body");if(this.selectedMessages.size>0){let l=t.createDiv("as-conv-selection-bar");l.createSpan({text:`${this.selectedMessages.size} message${this.selectedMessages.size>1?"s":""} selected`}),l.createEl("button",{cls:"as-conv-save-selected-btn",text:"Save selected to vault"}).addEventListener("click",()=>this.saveToVault(e))}let s=20,i=e.messages.length,r=e.messages.slice(0,this.visibleCount);for(let l=0;l<r.length;l++)this.renderMessage(t,r[l],l);if(this.visibleCount<i){let l=i-this.visibleCount,O=Math.min(s,l),c=t.createDiv("as-conv-show-more");c.createEl("button",{text:`Show next ${O} messages`,cls:"as-conv-show-more-btn"}).addEventListener("click",()=>{this.visibleCount+=s,this.render()}),c.createEl("button",{text:`Show all ${i} messages`,cls:"as-conv-show-all-btn"}).addEventListener("click",()=>{this.visibleCount=i,this.render()})}let n=t.createDiv("as-conv-resume-section");n.createDiv({cls:"as-section-title",text:"Resume this conversation"}),n.createEl("code",{cls:"as-conv-resume-cmd",text:`claude --resume ${e.uuid}`}).addEventListener("click",()=>{navigator.clipboard.writeText(`claude --resume ${e.uuid}`),new z.Notice("Copied!",2e3)})}renderMessage(e,t,s){let i=t.role==="human",r=e.createDiv(`as-conv-msg ${i?"as-conv-msg-human":"as-conv-msg-assistant"}`);this.selectedMessages.has(s)&&r.addClass("as-conv-msg-selected");let n=r.createDiv("as-conv-msg-header"),o=n.createSpan("as-conv-msg-role-icon");(0,z.setIcon)(o,i?"user":"bot"),n.createSpan({cls:"as-conv-msg-role",text:i?"You":"Claude"}),t.timestamp&&n.createSpan({cls:"as-conv-msg-time",text:Sc(t.timestamp)});let l=n.createSpan("as-conv-msg-select");(0,z.setIcon)(l,this.selectedMessages.has(s)?"check-square":"square"),l.setAttribute("aria-label","Select message for export"),l.addEventListener("click",d=>{d.stopPropagation(),this.selectedMessages.has(s)?this.selectedMessages.delete(s):this.selectedMessages.add(s),this.render()});let O=r.createDiv("as-conv-msg-content"),c=t.text.length>2e3&&!i?t.text.slice(0,2e3)+`
28
29*... (truncated)*`:t.text;if(z.MarkdownRenderer.render(this.app,c,O,"",this.renderComponent),t.toolCalls&&t.toolCalls.length>0){let d=r.createDiv("as-conv-msg-tools"),p=[...new Set(t.toolCalls)];for(let u of p.slice(0,5))d.createSpan({cls:"as-conv-tool-badge",text:u});p.length>5&&d.createSpan({cls:"as-conv-tool-badge",text:`+${p.length-5}`})}}promptAddTag(e){let t=this.containerEl.querySelector(".as-conv-detail-tags");if(!t)return;let s=t.querySelector(".as-conv-tag-add");if(!s)return;let i=createEl("input",{type:"text",placeholder:"Enter tag...",cls:"as-conv-tag-input"});s.replaceWith(i),i.focus();let r=!1,n=()=>{if(r)return;r=!0;let o=i.value.trim().toLowerCase().replace(/\s+/g,"-");o&&this.store.addCustomTag(e.uuid,o),this.render()};i.addEventListener("keydown",o=>{o.key==="Enter"&&n(),o.key==="Escape"&&this.render()}),i.addEventListener("blur",n)}saveToVault(e){if(this.selectedMessages.size===0){new z.Notice("Select messages to export first",3e3);return}let t=Array.from(this.selectedMessages).sort((n,o)=>n-o).map(n=>e.messages[n]).filter(Boolean),s=yn({selectedMessages:t,conversation:e,vaultPath:this.vaultPath}),i=(0,dt.resolve)(Pn(e,this.vaultPath));if(!i.startsWith((0,dt.resolve)(this.vaultPath))){new z.Notice("Invalid path \u2014 cannot save outside vault",5e3);return}let r=(0,dt.dirname)(i);try{(0,Ne.existsSync)(r)||(0,Ne.mkdirSync)(r,{recursive:!0}),(0,Ne.writeFileSync)(i,s,"utf-8"),new z.Notice(`Saved to ${i.split("/").slice(-2).join("/")}`,5e3)}catch(n){new z.Notice(`Failed to save: ${n instanceof Error?n.message:String(n)}`,5e3)}}};var pt="agentfiles-view",Kt=class extends wn.ItemView{store;settings;saveSettings;sidebarPanel;listPanel;detailPanel;dashboardPanel;marketplacePanel;conversationStore=new Ft;convListPanel;convDetailPanel;sidebarEl;listEl;detailEl;dashboardEl;marketplaceEl;convListWrapperEl;convDetailWrapperEl;skillListWrapperEl;skillDetailWrapperEl;resizeHandle1;resizeHandle2;isDashboard=!1;isMarketplace=!1;isConversations=!1;updateRef=null;convUpdateRef=null;dragCleanup=null;constructor(e,t,s,i){super(e),this.store=t,this.settings=s,this.saveSettings=i}getViewType(){return pt}getDisplayText(){return"Agentfiles"}getIcon(){return"cpu"}async onOpen(){let e=this.contentEl;e.empty(),e.addClass("as-container"),this.sidebarEl=e.createDiv("as-panel as-panel-sidebar"),this.resizeHandle1=this.createResizeHandle(e,this.sidebarEl,"--as-sidebar-width",120,400),this.listEl=e.createDiv("as-panel as-panel-list"),this.resizeHandle2=this.createResizeHandle(e,this.listEl,"--as-list-width",180,600),this.detailEl=e.createDiv("as-panel as-panel-detail"),this.dashboardEl=e.createDiv("as-panel as-panel-dashboard as-hidden"),this.marketplaceEl=e.createDiv("as-panel as-panel-marketplace as-hidden"),this.skillListWrapperEl=this.listEl.createDiv("as-wrapper"),this.convListWrapperEl=this.listEl.createDiv("as-wrapper as-hidden"),this.skillDetailWrapperEl=this.detailEl.createDiv("as-wrapper"),this.convDetailWrapperEl=this.detailEl.createDiv("as-wrapper as-hidden");let t=this.app.vault.adapter.getBasePath?.()||"";this.sidebarPanel=new ft(this.sidebarEl,this.store,()=>this.toggleDashboard(),()=>this.toggleMarketplace(),()=>this.openCreateModal(),()=>this.toggleConversations(),this.conversationStore),this.listPanel=new gt(this.skillListWrapperEl,this.store,s=>this.onSelectItem(s)),this.detailPanel=new Yt(this.skillDetailWrapperEl,this.store,this.settings,this.saveSettings,this),this.dashboardPanel=new Mt(this.dashboardEl,this.app),this.marketplacePanel=new Gt(this.marketplaceEl,this,this.settings,()=>{this.store.refresh(this.settings)}),this.convListPanel=new Ht(this.convListWrapperEl,this.conversationStore,s=>this.onSelectConversation(s)),this.convDetailPanel=new Jt(this.convDetailWrapperEl,this.conversationStore,this.app,t),this.updateRef=this.store.on("updated",()=>this.renderAll()),this.convUpdateRef=this.conversationStore.on("conversations-updated",()=>{this.isConversations&&(this.convListPanel.render(),this.sidebarPanel.render())}),this.renderAll(),this.store.revalidate()}hideAllSpecialPanels(){this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.dashboardEl.addClass("as-hidden"),this.marketplaceEl.addClass("as-hidden")}showDefaultPanels(){this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden")}showSkillPanels(){this.skillListWrapperEl.removeClass("as-hidden"),this.skillDetailWrapperEl.removeClass("as-hidden"),this.convListWrapperEl.addClass("as-hidden"),this.convDetailWrapperEl.addClass("as-hidden")}showConversationPanels(){this.skillListWrapperEl.addClass("as-hidden"),this.skillDetailWrapperEl.addClass("as-hidden"),this.convListWrapperEl.removeClass("as-hidden"),this.convDetailWrapperEl.removeClass("as-hidden")}toggleDashboard(){this.dragCleanup?.(),this.dragCleanup=null,this.isDashboard=!this.isDashboard,this.isMarketplace=!1,this.isConversations=!1,this.hideAllSpecialPanels(),this.isDashboard?(this.dashboardEl.removeClass("as-hidden"),this.dashboardPanel.render()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setDashboardActive(this.isDashboard),this.sidebarPanel.setMarketplaceActive(!1),this.sidebarPanel.setConversationsActive(!1),this.sidebarPanel.render()}toggleMarketplace(){this.dragCleanup?.(),this.dragCleanup=null,this.isMarketplace=!this.isMarketplace,this.isDashboard=!1,this.isConversations=!1,this.hideAllSpecialPanels(),this.isMarketplace?(this.marketplaceEl.removeClass("as-hidden"),this.marketplacePanel.render()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setMarketplaceActive(this.isMarketplace),this.sidebarPanel.setDashboardActive(!1),this.sidebarPanel.setConversationsActive(!1),this.sidebarPanel.render()}toggleConversations(){this.dragCleanup?.(),this.dragCleanup=null,this.isConversations=!this.isConversations,this.isDashboard=!1,this.isMarketplace=!1,this.hideAllSpecialPanels(),this.isConversations?(this.showDefaultPanels(),this.showConversationPanels(),this.conversationStore.refresh(),this.convListPanel.render(),this.convDetailPanel.clear()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setConversationsActive(this.isConversations),this.sidebarPanel.setDashboardActive(!1),this.sidebarPanel.setMarketplaceActive(!1),this.sidebarPanel.render()}renderAll(){this.sidebarPanel.render(),!this.isDashboard&&!this.isMarketplace&&!this.isConversations&&(this.listPanel.render(),this.store.filteredItems.length||this.detailPanel.clear())}openCreateModal(){new Nt(this.app,e=>{this.store.refresh(this.settings),window.setTimeout(()=>{let t=this.store.allItems.find(s=>s.filePath===e||s.realPath===e);t&&this.onSelectItem(t)},100)}).open()}onSelectItem(e){this.isDashboard&&this.toggleDashboard(),this.isMarketplace&&this.toggleMarketplace(),this.isConversations&&this.toggleConversations(),this.listPanel.setSelected(e.id),this.listPanel.render(),this.detailPanel.show(e)}onSelectConversation(e){this.convListPanel.setSelected(e.uuid),this.convListPanel.render(),this.convDetailPanel.show(e)}createResizeHandle(e,t,s,i,r){let n=e.createDiv("as-resize-handle"),o=0,l=0,O=d=>{let p=Math.min(r,Math.max(i,l+(d.clientX-o)));e.style.setProperty(s,`${p}px`)},c=()=>{n.removeClass("is-dragging"),activeDocument.removeEventListener("mousemove",O),activeDocument.removeEventListener("mouseup",c),this.dragCleanup=null};return n.addEventListener("mousedown",d=>{d.preventDefault(),o=d.clientX,l=parseInt(e.style.getPropertyValue(s))||t.offsetWidth,n.addClass("is-dragging"),activeDocument.addEventListener("mousemove",O),activeDocument.addEventListener("mouseup",c),this.dragCleanup=c}),n}async onClose(){this.dragCleanup?.(),this.updateRef&&this.store.offref(this.updateRef),this.convUpdateRef&&this.conversationStore.offref(this.convUpdateRef)}};var xn=require("obsidian"),ta=require("path"),Be=require("fs"),Zn=require("os");var Ss=(0,ta.join)((0,Zn.homedir)(),".skillkit","enrichment-cache.json");function vc(){if(!(0,Be.existsSync)(Ss))return null;try{return JSON.parse((0,Be.readFileSync)(Ss,"utf-8"))}catch{return null}}function $c(a){try{(0,Be.writeFileSync)(Ss,JSON.stringify(a),"utf-8")}catch{}}var ea=class extends xn.Events{items=new Map;_filter={kind:"all"};_searchQuery="";_deepSearch=!1;_deepSearchScope="both";_projectsHomeDir="";get filter(){return this._filter}get searchQuery(){return this._searchQuery}get deepSearch(){return this._deepSearch}get allItems(){return Array.from(this.items.values())}get filteredItems(){let e=this.allItems;switch(this._filter.kind){case"favorites":e=e.filter(t=>t.isFavorite);break;case"tool":{let t=this._filter.toolId;e=e.filter(s=>s.tools.includes(t));break}case"type":{let t=this._filter.type;e=e.filter(s=>s.type===t);break}case"collection":{let t=this._filter.name;e=e.filter(s=>s.collections.includes(t));break}case"project":{let t=this._filter.project;e=e.filter(s=>os(s.filePath,this._projectsHomeDir)===t);break}}if(this._searchQuery){let t=this._searchQuery.toLowerCase(),s=this._deepSearch&&(this._deepSearchScope==="description"||this._deepSearchScope==="both"),i=this._deepSearch&&(this._deepSearchScope==="content"||this._deepSearchScope==="both");e=e.filter(r=>r.name.toLowerCase().includes(t)||s&&r.description.toLowerCase().includes(t)||i&&r.content.toLowerCase().includes(t))}return e.sort((t,s)=>t.name.localeCompare(s.name))}getItem(e){return this.items.get(e)}get hasSkillkit(){return K()}_enrichGeneration=0;refresh(e){this._projectsHomeDir=e.projectsHomeDir,this.items=cn(e),K()&&this.applyEnrichmentFromCache(),this.trigger("updated")}revalidate(){K()&&this.revalidateAsync()}applyEnrichmentFromCache(){let e=vc();if(!e)return;let t=new Map(Object.entries(e.stats)),s=new Map(Object.entries(e.conflicts));this.applyEnrichment(t,s,e.warnings)}async revalidateAsync(){let e=++this._enrichGeneration,[t,s,i]=await Promise.all([ys(),ws(),xs()]);e===this._enrichGeneration&&(this.applyEnrichment(t,s,i),this.trigger("updated"),$c({stats:Object.fromEntries(t),conflicts:Object.fromEntries(s),warnings:i}))}applyEnrichment(e,t,s){let i=new Set(s.oversized.map(l=>l.name)),r=new Set(s.longDesc.map(l=>l.name)),n=new Map(s.oversized.map(l=>[l.name,l.lines])),o=new Map(s.longDesc.map(l=>[l.name,l.chars]));for(let l of this.items.values()){let O=l.filePath.split(ta.sep).slice(-2,-1)[0],c=l.name.toLowerCase().replace(/\s+/g,"-"),d=e.get(l.name)||e.get(O)||e.get(c);d?(d.isHeavy=l.content.length>5e3,l.usage=d):l.usage={uses:0,lastUsed:null,daysSinceUsed:null,isStale:!0,isHeavy:l.content.length>5e3};let p=l.content.split(`
30`).length,u=l.description.length;l.warnings={oversized:i.has(l.name)||p>500,longDesc:r.has(l.name)||u>1024,lineCount:n.get(l.name)??p,descChars:o.get(l.name)??u},l.conflicts=t.get(l.name)||t.get(O)||[]}}setFilter(e){this._filter=e,this.trigger("updated")}setSearch(e){this._searchQuery=e,this.trigger("updated")}setDeepSearch(e){this._deepSearch!==e&&(this._deepSearch=e,this.trigger("updated"))}setDeepSearchScope(e){this._deepSearchScope!==e&&(this._deepSearchScope=e,this.trigger("updated"))}toggleFavorite(e,t){let s=this.items.get(e);s&&(s.isFavorite=!s.isFavorite,s.isFavorite?t.favorites.includes(e)||t.favorites.push(e):t.favorites=t.favorites.filter(i=>i!==e),this.trigger("updated"))}getToolCounts(){let e=new Map;for(let t of this.items.values())for(let s of t.tools)e.set(s,(e.get(s)||0)+1);return e}getTypeCounts(){let e=new Map;for(let t of this.items.values())e.set(t.type,(e.get(t.type)||0)+1);return e}getProjectCounts(){let e=new Map;for(let t of this.items.values()){let s=os(t.filePath,this._projectsHomeDir);e.set(s,(e.get(s)||0)+1)}return e}};var Tn=require("fs"),aa=class{watchers=[];debounceTimer=null;debounceMs;onChange;constructor(e,t){this.debounceMs=e,this.onChange=t}watchPaths(e){this.close();for(let t of e)try{let s=(0,Tn.watch)(t,{recursive:!0},()=>this.scheduleUpdate());this.watchers.push(s)}catch{}}scheduleUpdate(){this.debounceTimer&&window.clearTimeout(this.debounceTimer),this.debounceTimer=window.setTimeout(()=>{this.debounceTimer=null,this.onChange()},this.debounceMs)}close(){this.debounceTimer&&(window.clearTimeout(this.debounceTimer),this.debounceTimer=null);for(let e of this.watchers)try{e.close()}catch{}this.watchers=[]}};var N=require("obsidian");var sa=class extends N.PluginSettingTab{plugin;constructor(e,t){super(e,t),this.plugin=t}display(){let{containerEl:e}=this;e.empty(),new N.Setting(e).setName("File watching").setDesc("Automatically detect changes to skill files").addToggle(t=>t.setValue(this.plugin.settings.watchEnabled).onChange(async s=>{this.plugin.settings.watchEnabled=s,await this.plugin.saveSettings(),this.plugin.restartWatcher()})),new N.Setting(e).setName("Watch debounce (ms)").setDesc("Delay before re-scanning after file changes").addText(t=>t.setValue(String(this.plugin.settings.watchDebounceMs)).onChange(async s=>{let i=parseInt(s);!isNaN(i)&&i>=100&&(this.plugin.settings.watchDebounceMs=i,await this.plugin.saveSettings())})),new N.Setting(e).setName("Display names").setDesc("How skill and command names are displayed in the list").addDropdown(t=>t.addOptions({auto:"Auto (frontmatter / heading / filename)",filename:"Filename only"}).setValue(this.plugin.settings.namingMode||"auto").onChange(async s=>{this.plugin.settings.namingMode=s,await this.plugin.saveSettings(),this.plugin.refreshStore()})),new N.Setting(e).setName("Deep search by default").setDesc("Enable deep search when the view opens (can always be toggled in the search bar)").addToggle(t=>t.setValue(this.plugin.settings.deepSearchDefault??!1).onChange(async s=>{this.plugin.settings.deepSearchDefault=s,await this.plugin.saveSettings()})),new N.Setting(e).setName("Deep search scope").setDesc("What to include when deep search is enabled").addDropdown(t=>t.addOptions({both:"Description and file content",description:"Description only",content:"File content only"}).setValue(this.plugin.settings.deepSearchScope??"both").onChange(async s=>{this.plugin.settings.deepSearchScope=s,await this.plugin.saveSettings()})),new N.Setting(e).setName("Marketplace").setHeading(),new N.Setting(e).setName("Package runner").setDesc("Command used to install skills from the marketplace").addDropdown(t=>t.addOptions({auto:"Auto-detect",npx:"npx",bunx:"bunx"}).setValue(this.plugin.settings.packageRunner).onChange(async s=>{this.plugin.settings.packageRunner=s,await this.plugin.saveSettings()})),new N.Setting(e).setName("Project scanning").setHeading(),new N.Setting(e).setName("Scan projects").setDesc("Scan all directories under the projects home folder for project-level skills").addToggle(t=>t.setValue(this.plugin.settings.projectScanEnabled).onChange(async s=>{this.plugin.settings.projectScanEnabled=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new N.Setting(e).setName("Projects home directory").setDesc("Root directory to scan for project-level skills. Leave empty for home directory (~).").addText(t=>t.setPlaceholder("~").setValue(this.plugin.settings.projectsHomeDir).onChange(async s=>{this.plugin.settings.projectsHomeDir=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new N.Setting(e).setName("Tools").setHeading();for(let t of W){let s=t.isInstalled(),i=this.plugin.settings.tools[t.id]||{enabled:!0,customPaths:[]};new N.Setting(e).setName(t.name).setDesc(s?"Installed":"Not detected").addToggle(r=>r.setValue(s&&i.enabled).setDisabled(!s).onChange(async n=>{this.plugin.settings.tools[t.id]={...i,enabled:n},await this.plugin.saveSettings(),this.plugin.refreshStore()}))}}};var ia=class extends Xn.Plugin{settings=us;store=new ea;watcher=null;async onload(){await this.loadSettings(),this.addVaultPath(),this.registerView(pt,e=>new Kt(e,this.store,this.settings,()=>this.saveSettings())),this.addRibbonIcon("cpu","Agentfiles",()=>this.activateView()),this.addCommand({id:"open",name:"Open",callback:()=>this.activateView()}),this.addSettingTab(new sa(this.app,this)),this.store.setDeepSearch(this.settings.deepSearchDefault??!1),this.store.setDeepSearchScope(this.settings.deepSearchScope??"both"),this.app.workspace.onLayoutReady(()=>{this.refreshStore(),this.startWatcher()})}addVaultPath(){let e=this.app.vault.adapter;if(!e.getBasePath)return;let t=e.getBasePath();this.settings.customScanPaths.includes(t)||this.settings.customScanPaths.push(t)}onunload(){this.stopWatcher()}refreshStore(){this.store.refresh(this.settings)}startWatcher(){this.settings.watchEnabled&&(this.watcher=new aa(this.settings.watchDebounceMs,()=>this.refreshStore()),this.watcher.watchPaths(dn(this.settings)))}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null)}restartWatcher(){this.stopWatcher(),this.startWatcher()}async activateView(){let e=this.app.workspace.getLeavesOfType(pt);if(e.length>0){await this.app.workspace.revealLeaf(e[0]);return}let t=this.app.workspace.getLeaf("tab");await t.setViewState({type:pt,active:!0}),await this.app.workspace.revealLeaf(t)}async loadSettings(){let e=await this.loadData();this.settings=Object.assign({},us,e)}async saveSettings(){await this.saveData(this.settings)}};

Callers 1

renderMethod · 0.45

Calls 4

sliceMethod · 0.80
saveToVaultMethod · 0.45
renderMessageMethod · 0.45
renderMethod · 0.45

Tested by

no test coverage detected