@apteva/apteva-linux-arm64 0.4.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/apteva +0 -0
  2. package/dist/ActivityPage.41nbye4r.js +3 -0
  3. package/dist/ActivityPage.41nbye4r.js.map +9 -0
  4. package/dist/ApiDocsPage.4smnt8m3.js +4 -0
  5. package/dist/ApiDocsPage.4smnt8m3.js.map +10 -0
  6. package/dist/App.0sbax9et.js +4 -0
  7. package/dist/App.0sbax9et.js.map +10 -0
  8. package/dist/App.0ws427h8.js +4 -0
  9. package/dist/App.0ws427h8.js.map +10 -0
  10. package/dist/App.6q6bar8b.js +4 -0
  11. package/dist/App.6q6bar8b.js.map +10 -0
  12. package/dist/App.80301vdb.js +4 -0
  13. package/dist/App.80301vdb.js.map +10 -0
  14. package/dist/App.af2wg84v.js +267 -0
  15. package/dist/App.af2wg84v.js.map +35 -0
  16. package/dist/App.ca1rz1ph.js +4 -0
  17. package/dist/App.ca1rz1ph.js.map +14 -0
  18. package/dist/App.ensa6z0r.js +4 -0
  19. package/dist/App.ensa6z0r.js.map +10 -0
  20. package/dist/App.f8g7tych.js +13 -0
  21. package/dist/App.f8g7tych.js.map +10 -0
  22. package/dist/App.mvtqv6qc.js +20 -0
  23. package/dist/App.mvtqv6qc.js.map +14 -0
  24. package/dist/App.ncgc9cxy.js +4 -0
  25. package/dist/App.ncgc9cxy.js.map +10 -0
  26. package/dist/App.p02f4ret.js +1 -0
  27. package/dist/App.p0fb1pds.js +4 -0
  28. package/dist/App.p0fb1pds.js.map +10 -0
  29. package/dist/App.pmaq48sj.js +4 -0
  30. package/dist/App.pmaq48sj.js.map +10 -0
  31. package/dist/App.yv87t9m5.js +4 -0
  32. package/dist/App.yv87t9m5.js.map +10 -0
  33. package/dist/App.zjmfm8p6.js +4 -0
  34. package/dist/App.zjmfm8p6.js.map +10 -0
  35. package/dist/ConnectionsPage.anb3rv9a.js +3 -0
  36. package/dist/ConnectionsPage.anb3rv9a.js.map +9 -0
  37. package/dist/McpPage.y396h6fy.js +3 -0
  38. package/dist/McpPage.y396h6fy.js.map +9 -0
  39. package/dist/SettingsPage.p1hc60gk.js +3 -0
  40. package/dist/SettingsPage.p1hc60gk.js.map +9 -0
  41. package/dist/SkillsPage.yj3xdsay.js +3 -0
  42. package/dist/SkillsPage.yj3xdsay.js.map +9 -0
  43. package/dist/TasksPage.sjv0khtv.js +3 -0
  44. package/dist/TasksPage.sjv0khtv.js.map +9 -0
  45. package/dist/TelemetryPage.2qm4w16r.js +3 -0
  46. package/dist/TelemetryPage.2qm4w16r.js.map +9 -0
  47. package/dist/TestsPage.zzs4qfj8.js +3 -0
  48. package/dist/TestsPage.zzs4qfj8.js.map +9 -0
  49. package/dist/apteva-kit.css +1 -0
  50. package/dist/icon.png +0 -0
  51. package/dist/index.html +16 -0
  52. package/dist/styles.css +1 -0
  53. package/index.js +1 -0
  54. package/package.json +10 -0
@@ -0,0 +1,13 @@
1
+ import{O as Oz,P as Wz}from"./App.yv87t9m5.js";import{R as j}from"./App.p0fb1pds.js";import{S as n,V as Qz,W as zz,ca as Jz,fa as Kz}from"./App.mvtqv6qc.js";var W=n(Qz(),1);var z=n(zz(),1);function Rz(){let{authFetch:K}=Jz(),{projects:Z,currentProjectId:Y}=Kz(),[B,N]=W.useState([]),[y,M]=W.useState(!0),[X,U]=W.useState("installed"),[G,Q]=W.useState(!1),[C,H]=W.useState(!1),[v,T]=W.useState(null),{confirm:f,ConfirmDialog:w}=Oz(),{alert:P,AlertDialog:d}=Wz(),_=Z.length>0,[m,p]=W.useState(""),[h,Xz]=W.useState([]),[c,r]=W.useState(!1),[Yz,o]=W.useState(null),[a,i]=W.useState(""),[R,t]=W.useState([]),[I,u]=W.useState(!1),[V,b]=W.useState(null),[q,l]=W.useState(null),[e,S]=W.useState(null),[x,Zz]=W.useState(Y&&Y!=="unassigned"?Y:null),D=B.filter((J)=>{if(!Y)return!0;if(Y==="unassigned")return J.project_id===null;return J.project_id===null||J.project_id===Y}),F=async()=>{try{let O=await(await K("/api/skills")).json();N(O.skills||[])}catch(J){console.error("Failed to fetch skills:",J)}M(!1)},E=async(J)=>{r(!0);try{let O=J!==void 0?J:m,$=O?`/api/skills/marketplace/search?q=${encodeURIComponent(O)}`:"/api/skills/marketplace/featured",A=await(await K($)).json();Xz(A.skills||[])}catch(O){console.error("Failed to search marketplace:",O)}r(!1)};W.useEffect(()=>{F()},[K]),W.useEffect(()=>{if(X==="marketplace"&&h.length===0)E("")},[X]);let _z=async(J)=>{try{await K(`/api/skills/${J}/toggle`,{method:"POST"}),F()}catch(O){console.error("Failed to toggle skill:",O)}},$z=async(J)=>{if(!await f("Delete this skill?",{confirmText:"Delete",title:"Delete Skill"}))return;try{if(await K(`/api/skills/${J}`,{method:"DELETE"}),v?.id===J)T(null);F()}catch($){console.error("Failed to delete skill:",$)}},Bz=async(J)=>{o(J.id);try{let O=await K(`/api/skills/marketplace/${J.id}/install`,{method:"POST"}),$=await O.json();if(O.ok)await P(`Installed "${J.name}" successfully!`,{title:"Skill Installed"}),F(),U("installed");else await P($.error||"Failed to install skill",{title:"Installation Failed"})}catch(O){console.error("Failed to install skill:",O),await P("Failed to install skill",{title:"Error"})}o(null)},g=(J)=>B.some((O)=>O.name===J),s=async(J)=>{let O=J||a;if(!O.trim())return;let $="",L="";if(O.includes("github.com")){let A=O.match(/github\.com\/([^/]+)\/([^/]+)/);if(A)$=A[1],L=A[2].replace(/\.git$/,"")}else if(O.includes("/")){let A=O.split("/");$=A[0],L=A[1]}if(!$||!L){b("Invalid repo format. Use 'owner/repo' or GitHub URL");return}u(!0),b(null),t([]),l(null);try{let A=await K(`/api/skills/github/${$}/${L}`),k=await A.json();if(!A.ok){b(k.error||"Failed to fetch repository"),u(!1);return}t(k.skills||[]),l(k.repo||null)}catch(A){b("Failed to fetch repository")}u(!1)},Nz=async(J)=>{if(!q)return;S(J.name);try{let O=await K("/api/skills/github/install",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({owner:q.owner,repo:q.repo,skillName:J.name,downloadUrl:J.downloadUrl,projectId:x})}),$=await O.json();if(O.ok)await P(`Installed "${J.name}" successfully!`,{title:"Skill Installed"}),F();else await P($.error||"Failed to install skill",{title:"Installation Failed",variant:"error"})}catch(O){await P("Failed to install skill",{title:"Error",variant:"error"})}S(null)},Uz=async()=>{if(!q||R.length===0)return;let J=R.filter((L)=>!g(L.name));if(J.length===0){await P("All skills are already installed",{title:"Info"});return}if(!await f(`Install ${J.length} skill(s) from ${q.owner}/${q.repo}?`,{confirmText:"Install All",title:"Install Skills"}))return;let $=0;for(let L of J){S(L.name);try{if((await K("/api/skills/github/install",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({owner:q.owner,repo:q.repo,skillName:L.name,downloadUrl:L.downloadUrl,projectId:x})})).ok)$++}catch(A){}}S(null),F(),await P(`Installed ${$} of ${J.length} skills`,{title:"Installation Complete"})};return z.jsxDEV(z.Fragment,{children:[w,d,z.jsxDEV("div",{className:"flex-1 overflow-auto p-6",children:z.jsxDEV("div",{className:"max-w-6xl",children:[z.jsxDEV("div",{className:"flex items-center justify-between mb-6",children:[z.jsxDEV("div",{children:[z.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"Skills"},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-[#666]",children:"Manage agent skills - instructions that teach agents how to perform tasks."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="installed"&&z.jsxDEV("div",{className:"flex gap-2",children:[z.jsxDEV("button",{onClick:()=>H(!0),className:"bg-[#1a1a1a] hover:bg-[#222] text-white px-4 py-2 rounded font-medium transition border border-[#333]",children:"Import"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:()=>Q(!0),className:"bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition",children:"+ Create Skill"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"flex gap-1 mb-6 bg-[#111] border border-[#1a1a1a] rounded-lg p-1 w-fit",children:[z.jsxDEV("button",{onClick:()=>U("installed"),className:`px-4 py-2 rounded text-sm font-medium transition ${X==="installed"?"bg-[#1a1a1a] text-white":"text-[#666] hover:text-[#888]"}`,children:["Installed (",D.length,")"]},void 0,!0,void 0,this),z.jsxDEV("button",{onClick:()=>U("github"),className:`px-4 py-2 rounded text-sm font-medium transition ${X==="github"?"bg-[#1a1a1a] text-white":"text-[#666] hover:text-[#888]"}`,children:"Browse GitHub"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:()=>U("marketplace"),className:`px-4 py-2 rounded text-sm font-medium transition ${X==="marketplace"?"bg-[#1a1a1a] text-white":"text-[#666] hover:text-[#888]"}`,children:"Marketplace"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="installed"&&z.jsxDEV(z.Fragment,{children:y?z.jsxDEV("div",{className:"text-[#666]",children:"Loading skills..."},void 0,!1,void 0,this):B.length===0?z.jsxDEV("div",{className:"text-center py-20 text-[#666]",children:[z.jsxDEV("p",{className:"text-lg",children:"No skills installed"},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-sm mt-1",children:"Create a skill or browse the marketplace"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:()=>U("marketplace"),className:"mt-4 bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition",children:"Browse Marketplace"},void 0,!1,void 0,this)]},void 0,!0,void 0,this):D.length===0?z.jsxDEV("div",{className:"bg-[#111] border border-[#1a1a1a] rounded-lg p-6 text-center",children:z.jsxDEV("p",{className:"text-[#666]",children:"No skills match this filter."},void 0,!1,void 0,this)},void 0,!1,void 0,this):z.jsxDEV("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:D.map((J)=>{let O=_&&J.project_id?Z.find(($)=>$.id===J.project_id):null;return z.jsxDEV(Hz,{skill:J,project:O,onToggle:()=>_z(J.id),onDelete:()=>$z(J.id),onView:()=>T(J)},J.id,!1,void 0,this)})},void 0,!1,void 0,this)},void 0,!1,void 0,this),X==="github"&&z.jsxDEV("div",{className:"space-y-6",children:[z.jsxDEV("form",{onSubmit:(J)=>{J.preventDefault(),s()},className:"flex gap-2",children:[z.jsxDEV("input",{type:"text",value:a,onChange:(J)=>i(J.target.value),placeholder:"Enter GitHub repo (e.g., WordPress/agent-skills)",className:"flex-1 bg-[#111] border border-[#333] rounded-lg px-4 py-3 focus:outline-none focus:border-[#f97316]"},void 0,!1,void 0,this),z.jsxDEV("button",{type:"submit",disabled:I,className:"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition",children:I?"...":"Browse"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_&&R.length>0&&z.jsxDEV("div",{className:"flex items-center gap-3 p-3 bg-[#0a0a0a] border border-[#222] rounded-lg",children:[z.jsxDEV("span",{className:"text-sm text-[#666]",children:"Install to:"},void 0,!1,void 0,this),z.jsxDEV(j,{value:x||"",onChange:(J)=>Zz(J||null),options:[{value:"",label:"Global (all projects)"},...Z.map((J)=>({value:J.id,label:J.name}))],placeholder:"Select scope..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V&&z.jsxDEV("div",{className:"text-red-400 text-sm p-3 bg-red-500/10 border border-red-500/20 rounded-lg",children:V},void 0,!1,void 0,this),q&&R.length>0&&z.jsxDEV("div",{className:"flex items-center justify-between",children:[z.jsxDEV("div",{className:"flex items-center gap-3",children:[z.jsxDEV("a",{href:q.url,target:"_blank",rel:"noopener noreferrer",className:"text-[#f97316] hover:underline font-medium",children:[q.owner,"/",q.repo]},void 0,!0,void 0,this),z.jsxDEV("span",{className:"text-sm text-[#666]",children:[R.length," skill",R.length!==1?"s":""," found"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R.some((J)=>!g(J.name))&&z.jsxDEV("button",{onClick:Uz,disabled:!!e,className:"text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-4 py-2 rounded transition disabled:opacity-50",children:"Install All"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),I&&z.jsxDEV("div",{className:"text-center py-8 text-[#666]",children:"Fetching skills from repository..."},void 0,!1,void 0,this),!I&&!q&&!V&&z.jsxDEV("div",{className:"bg-[#111] border border-[#1a1a1a] rounded-lg p-8 text-center",children:[z.jsxDEV("div",{className:"text-4xl mb-4",children:"\uD83D\uDCE6"},void 0,!1,void 0,this),z.jsxDEV("h3",{className:"text-lg font-medium mb-2",children:"Browse Skills from GitHub"},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-[#666] mb-6 max-w-md mx-auto",children:"Enter a GitHub repository to browse and install skills. Skills are markdown files with instructions that teach agents how to perform specific tasks."},void 0,!1,void 0,this),z.jsxDEV("div",{className:"flex flex-wrap gap-2 justify-center",children:[{label:"WordPress Skills",repo:"WordPress/agent-skills"}].map(({label:J,repo:O})=>z.jsxDEV("button",{onClick:()=>{i(O),s(O)},className:"text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition",children:J},O,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!I&&q&&R.length===0&&z.jsxDEV("div",{className:"text-center py-8 text-[#666]",children:"No skills found in this repository. Skills should be in subdirectories with a SKILL.md file."},void 0,!1,void 0,this),R.length>0&&z.jsxDEV("div",{className:"grid gap-4 md:grid-cols-2",children:R.map((J)=>{let O=g(J.name),$=e===J.name;return z.jsxDEV("div",{className:`bg-[#111] border rounded-lg p-4 transition ${O?"border-green-500/30":"border-[#1a1a1a] hover:border-[#333]"}`,children:z.jsxDEV("div",{className:"flex items-start justify-between gap-3",children:[z.jsxDEV("div",{className:"flex-1 min-w-0",children:[z.jsxDEV("div",{className:"flex items-center gap-2",children:[z.jsxDEV("h3",{className:"font-medium truncate",children:J.name},void 0,!1,void 0,this),O&&z.jsxDEV("span",{className:"text-xs text-green-400",children:"✓ Installed"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("p",{className:"text-sm text-[#666] mt-1 line-clamp-2",children:J.description||"No description"},void 0,!1,void 0,this),z.jsxDEV("div",{className:"flex items-center gap-2 mt-2 text-xs text-[#555]",children:[z.jsxDEV("span",{children:[(J.size/1024).toFixed(1),"KB"]},void 0,!0,void 0,this),z.jsxDEV("span",{className:"px-1.5 py-0.5 rounded bg-blue-500/10 text-blue-400",children:"GitHub"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"flex-shrink-0",children:O?z.jsxDEV("span",{className:"text-xs text-[#555] px-3 py-1.5",children:"Added"},void 0,!1,void 0,this):z.jsxDEV("button",{onClick:()=>Nz(J),disabled:$,className:"text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition disabled:opacity-50",children:$?"Installing...":"Install"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},J.name,!1,void 0,this)})},void 0,!1,void 0,this),z.jsxDEV("div",{className:"p-4 bg-[#111] border border-[#1a1a1a] rounded-lg text-sm text-[#666]",children:z.jsxDEV("p",{children:["Skills are sourced from GitHub repositories. Each skill should be in its own directory with a"," ",z.jsxDEV("code",{className:"text-[#888] bg-[#0a0a0a] px-1 rounded",children:"SKILL.md"},void 0,!1,void 0,this)," file containing instructions."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X==="marketplace"&&z.jsxDEV(z.Fragment,{children:[z.jsxDEV("div",{className:"mb-6",children:z.jsxDEV("div",{className:"flex gap-2",children:[z.jsxDEV("input",{type:"text",value:m,onChange:(J)=>p(J.target.value),onKeyDown:(J)=>J.key==="Enter"&&E(),placeholder:"Search skills...",className:"flex-1 bg-[#111] border border-[#1a1a1a] rounded px-4 py-2 focus:outline-none focus:border-[#f97316]"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:()=>E(),disabled:c,className:"bg-[#1a1a1a] hover:bg-[#222] text-white px-4 py-2 rounded font-medium transition border border-[#333]",children:c?"...":"Search"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c?z.jsxDEV("div",{className:"text-[#666]",children:"Loading..."},void 0,!1,void 0,this):h.length===0?z.jsxDEV("div",{className:"text-center py-20 text-[#666]",children:[z.jsxDEV("p",{className:"text-lg",children:"No skills found"},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-sm mt-1",children:"Try a different search term"},void 0,!1,void 0,this)]},void 0,!0,void 0,this):z.jsxDEV("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:h.map((J)=>z.jsxDEV(qz,{skill:J,installed:g(J.name),installing:Yz===J.id,onInstall:()=>Bz(J)},J.id,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G&&z.jsxDEV(Az,{authFetch:K,onClose:()=>Q(!1),onCreated:()=>{Q(!1),F()},projects:_?Z:void 0,defaultProjectId:Y&&Y!=="unassigned"?Y:null},void 0,!1,void 0,this),C&&z.jsxDEV(yz,{authFetch:K,onClose:()=>H(!1),onImported:()=>{H(!1),F()}},void 0,!1,void 0,this),v&&z.jsxDEV(Mz,{skill:v,authFetch:K,onClose:()=>T(null),onUpdated:()=>{T(null),F()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Hz({skill:K,project:Z,onToggle:Y,onDelete:B,onView:N}){let y={local:"Local",skillsmp:"SkillsMP",github:"GitHub",import:"Imported"}[K.source],M=()=>{if(Z)return z.jsxDEV("span",{className:"text-xs px-1.5 py-0.5 rounded",style:{backgroundColor:`${Z.color}20`,color:Z.color},children:Z.name},void 0,!1,void 0,this);if(K.project_id===null)return z.jsxDEV("span",{className:"text-xs text-[#666] bg-[#1a1a1a] px-1.5 py-0.5 rounded",children:"Global"},void 0,!1,void 0,this);return null};return z.jsxDEV("div",{className:`bg-[#111] rounded-lg p-5 border transition cursor-pointer ${K.enabled?"border-[#1a1a1a]":"border-[#1a1a1a] opacity-60"} hover:border-[#333]`,onClick:N,children:[z.jsxDEV("div",{className:"flex items-start justify-between mb-3",children:[z.jsxDEV("div",{className:"flex-1 min-w-0",children:[z.jsxDEV("div",{className:"flex items-center gap-2",children:[z.jsxDEV("h3",{className:"font-semibold text-lg truncate",children:K.name},void 0,!1,void 0,this),M()]},void 0,!0,void 0,this),z.jsxDEV("p",{className:"text-xs text-[#666] flex items-center gap-2 mt-0.5",children:[z.jsxDEV("span",{className:`px-1.5 py-0.5 rounded text-[10px] ${K.source==="skillsmp"?"bg-purple-500/20 text-purple-400":K.source==="github"?"bg-blue-500/20 text-blue-400":"bg-[#222] text-[#888]"}`,children:y},void 0,!1,void 0,this),K.metadata?.version&&z.jsxDEV("span",{children:["v",K.metadata.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("button",{onClick:(X)=>{X.stopPropagation(),Y()},className:`w-10 h-5 rounded-full transition-colors relative ${K.enabled?"bg-[#f97316]":"bg-[#333]"}`,children:z.jsxDEV("span",{className:`absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform ${K.enabled?"left-5":"left-0.5"}`},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("p",{className:"text-sm text-[#888] line-clamp-2 mb-4",children:K.description},void 0,!1,void 0,this),z.jsxDEV("div",{className:"flex items-center justify-between",children:[z.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:[K.allowed_tools.slice(0,2).map((X)=>z.jsxDEV("span",{className:"text-xs bg-[#222] px-2 py-0.5 rounded text-[#666]",children:X},X,!1,void 0,this)),K.allowed_tools.length>2&&z.jsxDEV("span",{className:"text-xs text-[#666]",children:["+",K.allowed_tools.length-2]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("button",{onClick:(X)=>{X.stopPropagation(),B()},className:"text-red-400 hover:text-red-300 text-sm",children:"Delete"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function qz({skill:K,installed:Z,installing:Y,onInstall:B}){return z.jsxDEV("div",{className:"bg-[#111] rounded-lg p-5 border border-[#1a1a1a] hover:border-[#333] transition",children:[z.jsxDEV("div",{className:"flex items-start justify-between mb-3",children:[z.jsxDEV("div",{className:"flex-1 min-w-0",children:[z.jsxDEV("h3",{className:"font-semibold text-lg truncate",children:K.name},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-xs text-[#666] mt-0.5",children:["by ",K.author," · v",K.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"flex items-center gap-1 text-yellow-500 text-sm",children:["★ ",K.rating.toFixed(1)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("p",{className:"text-sm text-[#888] line-clamp-2 mb-4",children:K.description},void 0,!1,void 0,this),z.jsxDEV("div",{className:"flex items-center justify-between",children:[z.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:K.tags.slice(0,3).map((N)=>z.jsxDEV("span",{className:"text-xs bg-[#222] px-2 py-0.5 rounded text-[#666]",children:N},N,!1,void 0,this))},void 0,!1,void 0,this),Z?z.jsxDEV("span",{className:"text-green-400 text-sm",children:"✓ Installed"},void 0,!1,void 0,this):z.jsxDEV("button",{onClick:B,disabled:Y,className:"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-3 py-1 rounded text-sm font-medium transition",children:Y?"Installing...":"Install"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"mt-3 text-xs text-[#555]",children:[K.downloads.toLocaleString()," downloads"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Az({authFetch:K,onClose:Z,onCreated:Y,projects:B,defaultProjectId:N}){let[y,M]=W.useState(""),[X,U]=W.useState(""),[G,Q]=W.useState(""),[C,H]=W.useState(N||null),[v,T]=W.useState(!1),[f,w]=W.useState(null),P=B&&B.length>0,d=async()=>{if(!y||!X||!G){w("All fields are required");return}T(!0),w(null);try{let _={name:y,description:X,content:G,source:"local"};if(C)_.project_id=C;let m=await K("/api/skills",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(_)}),p=await m.json();if(!m.ok){w(p.error||"Failed to create skill"),T(!1);return}Y()}catch(_){w("Failed to create skill"),T(!1)}};return z.jsxDEV("div",{className:"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4",onClick:Z,children:z.jsxDEV("div",{className:"bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto",onClick:(_)=>_.stopPropagation(),children:[z.jsxDEV("div",{className:"p-6 border-b border-[#1a1a1a]",children:z.jsxDEV("h2",{className:"text-xl font-semibold",children:"Create Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.jsxDEV("div",{className:"p-6 space-y-4",children:[f&&z.jsxDEV("div",{className:"bg-red-500/10 border border-red-500/30 rounded p-3 text-red-400 text-sm",children:f},void 0,!1,void 0,this),z.jsxDEV("div",{children:[z.jsxDEV("label",{className:"block text-sm text-[#888] mb-1",children:"Name"},void 0,!1,void 0,this),z.jsxDEV("input",{type:"text",value:y,onChange:(_)=>M(_.target.value.toLowerCase().replace(/[^a-z0-9-]/g,"-")),placeholder:"my-skill-name",className:"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-xs text-[#555] mt-1",children:"Lowercase letters, numbers, and hyphens only"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{children:[z.jsxDEV("label",{className:"block text-sm text-[#888] mb-1",children:"Description"},void 0,!1,void 0,this),z.jsxDEV("input",{type:"text",value:X,onChange:(_)=>U(_.target.value),placeholder:"What this skill does and when to use it...",className:"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P&&z.jsxDEV("div",{children:[z.jsxDEV("label",{className:"block text-sm text-[#888] mb-1",children:"Scope"},void 0,!1,void 0,this),z.jsxDEV(j,{value:C||"",onChange:(_)=>H(_||null),options:[{value:"",label:"Global (all projects)"},...B.map((_)=>({value:_.id,label:_.name}))],placeholder:"Select scope..."},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-xs text-[#555] mt-1",children:"Global skills are available to all agents. Project-scoped skills are only available to agents in that project."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{children:[z.jsxDEV("label",{className:"block text-sm text-[#888] mb-1",children:"Instructions (Markdown)"},void 0,!1,void 0,this),z.jsxDEV("textarea",{value:G,onChange:(_)=>Q(_.target.value),placeholder:`# Skill Instructions
2
+
3
+ Write detailed instructions here...`,rows:12,className:"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"p-6 border-t border-[#1a1a1a] flex justify-end gap-3",children:[z.jsxDEV("button",{onClick:Z,className:"px-4 py-2 text-[#888] hover:text-white transition",children:"Cancel"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:d,disabled:v,className:"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition",children:v?"Creating...":"Create Skill"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}function yz({authFetch:K,onClose:Z,onImported:Y}){let[B,N]=W.useState(""),[y,M]=W.useState(!1),[X,U]=W.useState(null);return z.jsxDEV("div",{className:"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4",onClick:Z,children:z.jsxDEV("div",{className:"bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto",onClick:(Q)=>Q.stopPropagation(),children:[z.jsxDEV("div",{className:"p-6 border-b border-[#1a1a1a]",children:[z.jsxDEV("h2",{className:"text-xl font-semibold",children:"Import Skill"},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-sm text-[#666] mt-1",children:"Paste the contents of a SKILL.md file"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"p-6 space-y-4",children:[X&&z.jsxDEV("div",{className:"bg-red-500/10 border border-red-500/30 rounded p-3 text-red-400 text-sm",children:X},void 0,!1,void 0,this),z.jsxDEV("textarea",{value:B,onChange:(Q)=>N(Q.target.value),placeholder:`---
4
+ name: skill-name
5
+ description: What this skill does...
6
+ ---
7
+
8
+ # Instructions
9
+
10
+ Your skill instructions here...`,rows:16,className:"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"p-6 border-t border-[#1a1a1a] flex justify-end gap-3",children:[z.jsxDEV("button",{onClick:Z,className:"px-4 py-2 text-[#888] hover:text-white transition",children:"Cancel"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:async()=>{if(!B.trim()){U("Paste SKILL.md content");return}M(!0),U(null);try{let Q=await K("/api/skills/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:B})}),C=await Q.json();if(!Q.ok){U(C.error||"Failed to import skill"),M(!1);return}Y()}catch(Q){U("Failed to import skill"),M(!1)}},disabled:y,className:"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition",children:y?"Importing...":"Import Skill"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}function Mz({skill:K,authFetch:Z,onClose:Y,onUpdated:B}){let[N,y]=W.useState(!1),[M,X]=W.useState(K.content),[U,G]=W.useState(!1),Q=async()=>{G(!0);try{await Z(`/api/skills/${K.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:M})}),B()}catch(H){console.error("Failed to save:",H)}G(!1)},C=async()=>{try{let v=await(await Z(`/api/skills/${K.id}/export`)).text(),T=new Blob([v],{type:"text/markdown"}),f=URL.createObjectURL(T),w=document.createElement("a");w.href=f,w.download=`${K.name}-SKILL.md`,w.click(),URL.revokeObjectURL(f)}catch(H){console.error("Failed to export:",H)}};return z.jsxDEV("div",{className:"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4",onClick:Y,children:z.jsxDEV("div",{className:"bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-3xl max-h-[90vh] overflow-auto",onClick:(H)=>H.stopPropagation(),children:[z.jsxDEV("div",{className:"p-6 border-b border-[#1a1a1a] flex items-center justify-between",children:[z.jsxDEV("div",{children:[z.jsxDEV("h2",{className:"text-xl font-semibold",children:K.name},void 0,!1,void 0,this),z.jsxDEV("p",{className:"text-sm text-[#666] mt-0.5",children:K.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"flex gap-2",children:[z.jsxDEV("button",{onClick:C,className:"text-sm text-[#888] hover:text-white transition px-3 py-1 rounded border border-[#333]",children:"Export"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:()=>y(!N),className:"text-sm text-[#888] hover:text-white transition px-3 py-1 rounded border border-[#333]",children:N?"View":"Edit"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{className:"p-6",children:N?z.jsxDEV("textarea",{value:M,onChange:(H)=>X(H.target.value),rows:20,className:"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm"},void 0,!1,void 0,this):z.jsxDEV("pre",{className:"bg-[#0a0a0a] border border-[#222] rounded p-4 font-mono text-sm overflow-auto max-h-[60vh] whitespace-pre-wrap",children:K.content},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.jsxDEV("div",{className:"p-6 border-t border-[#1a1a1a] flex justify-between",children:[z.jsxDEV("div",{className:"text-xs text-[#555]",children:K.source!=="local"&&K.source_url&&z.jsxDEV("a",{href:K.source_url,target:"_blank",rel:"noopener noreferrer",className:"text-[#f97316] hover:underline",children:"View source →"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.jsxDEV("div",{className:"flex gap-3",children:[z.jsxDEV("button",{onClick:Y,className:"px-4 py-2 text-[#888] hover:text-white transition",children:"Close"},void 0,!1,void 0,this),N&&z.jsxDEV("button",{onClick:Q,disabled:U,className:"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition",children:U?"Saving...":"Save Changes"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}
11
+ export{Rz as L};
12
+
13
+ //# debugId=AAB8FFD9C3B0D3B464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/web/components/skills/SkillsPage.tsx"],
4
+ "sourcesContent": [
5
+ "import React, { useState, useEffect } from \"react\";\nimport { useAuth, useProjects } from \"../../context\";\nimport { useConfirm, useAlert } from \"../common/Modal\";\nimport { Select } from \"../common/Select\";\n\ninterface Skill {\n id: string;\n name: string;\n description: string;\n content: string;\n license: string | null;\n compatibility: string | null;\n metadata: Record<string, string>;\n allowed_tools: string[];\n source: \"local\" | \"skillsmp\" | \"github\" | \"import\";\n source_url: string | null;\n enabled: boolean;\n project_id: string | null; // null = global\n created_at: string;\n updated_at: string;\n}\n\ninterface MarketplaceSkill {\n id: string;\n name: string;\n description: string;\n content: string;\n author: string;\n version: string;\n license: string | null;\n compatibility: string | null;\n tags: string[];\n downloads: number;\n rating: number;\n repository: string | null;\n}\n\ninterface GitHubSkill {\n name: string;\n description: string;\n path: string;\n size: number;\n downloadUrl: string;\n}\n\nexport function SkillsPage() {\n const { authFetch } = useAuth();\n const { projects, currentProjectId } = useProjects();\n const [skills, setSkills] = useState<Skill[]>([]);\n const [loading, setLoading] = useState(true);\n const [activeTab, setActiveTab] = useState<\"installed\" | \"marketplace\" | \"github\">(\"installed\");\n const [showCreate, setShowCreate] = useState(false);\n const [showImport, setShowImport] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<Skill | null>(null);\n const { confirm, ConfirmDialog } = useConfirm();\n const { alert, AlertDialog } = useAlert();\n\n const hasProjects = projects.length > 0;\n\n // Marketplace state\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [marketplaceSkills, setMarketplaceSkills] = useState<MarketplaceSkill[]>([]);\n const [marketplaceLoading, setMarketplaceLoading] = useState(false);\n const [installing, setInstalling] = useState<string | null>(null);\n\n // GitHub state\n const [githubRepo, setGithubRepo] = useState(\"\");\n const [githubSkills, setGithubSkills] = useState<GitHubSkill[]>([]);\n const [githubLoading, setGithubLoading] = useState(false);\n const [githubError, setGithubError] = useState<string | null>(null);\n const [githubRepoInfo, setGithubRepoInfo] = useState<{ owner: string; repo: string; url: string } | null>(null);\n const [installingGithub, setInstallingGithub] = useState<string | null>(null);\n const [githubProjectId, setGithubProjectId] = useState<string | null>(\n currentProjectId && currentProjectId !== \"unassigned\" ? currentProjectId : null\n );\n\n // Filter skills based on global project selector\n // When a project is selected, show global + that project's skills\n const filteredSkills = skills.filter(skill => {\n if (!currentProjectId) return true; // \"All Projects\" - show everything\n if (currentProjectId === \"unassigned\") return skill.project_id === null; // Only global\n // Project selected: show global + project-specific\n return skill.project_id === null || skill.project_id === currentProjectId;\n });\n\n const fetchSkills = async () => {\n try {\n const res = await authFetch(\"/api/skills\");\n const data = await res.json();\n setSkills(data.skills || []);\n } catch (e) {\n console.error(\"Failed to fetch skills:\", e);\n }\n setLoading(false);\n };\n\n const searchMarketplace = async (query?: string) => {\n setMarketplaceLoading(true);\n try {\n const q = query !== undefined ? query : searchQuery;\n const endpoint = q\n ? `/api/skills/marketplace/search?q=${encodeURIComponent(q)}`\n : \"/api/skills/marketplace/featured\";\n const res = await authFetch(endpoint);\n const data = await res.json();\n setMarketplaceSkills(data.skills || []);\n } catch (e) {\n console.error(\"Failed to search marketplace:\", e);\n }\n setMarketplaceLoading(false);\n };\n\n useEffect(() => {\n fetchSkills();\n }, [authFetch]);\n\n useEffect(() => {\n if (activeTab === \"marketplace\" && marketplaceSkills.length === 0) {\n searchMarketplace(\"\");\n }\n }, [activeTab]);\n\n const toggleSkill = async (id: string) => {\n try {\n await authFetch(`/api/skills/${id}/toggle`, { method: \"POST\" });\n fetchSkills();\n } catch (e) {\n console.error(\"Failed to toggle skill:\", e);\n }\n };\n\n const deleteSkill = async (id: string) => {\n const confirmed = await confirm(\"Delete this skill?\", { confirmText: \"Delete\", title: \"Delete Skill\" });\n if (!confirmed) return;\n try {\n await authFetch(`/api/skills/${id}`, { method: \"DELETE\" });\n if (selectedSkill?.id === id) {\n setSelectedSkill(null);\n }\n fetchSkills();\n } catch (e) {\n console.error(\"Failed to delete skill:\", e);\n }\n };\n\n const installFromMarketplace = async (skill: MarketplaceSkill) => {\n setInstalling(skill.id);\n try {\n const res = await authFetch(`/api/skills/marketplace/${skill.id}/install`, { method: \"POST\" });\n const data = await res.json();\n if (res.ok) {\n await alert(`Installed \"${skill.name}\" successfully!`, { title: \"Skill Installed\" });\n fetchSkills();\n setActiveTab(\"installed\");\n } else {\n await alert(data.error || \"Failed to install skill\", { title: \"Installation Failed\" });\n }\n } catch (e) {\n console.error(\"Failed to install skill:\", e);\n await alert(\"Failed to install skill\", { title: \"Error\" });\n }\n setInstalling(null);\n };\n\n const isInstalled = (name: string) => skills.some((s) => s.name === name);\n\n // GitHub functions\n const browseGitHubRepo = async (repoInput?: string) => {\n const input = repoInput || githubRepo;\n if (!input.trim()) return;\n\n // Parse repo input: \"owner/repo\" or full URL\n let owner = \"\";\n let repo = \"\";\n\n if (input.includes(\"github.com\")) {\n const match = input.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (match) {\n owner = match[1];\n repo = match[2].replace(/\\.git$/, \"\");\n }\n } else if (input.includes(\"/\")) {\n const parts = input.split(\"/\");\n owner = parts[0];\n repo = parts[1];\n }\n\n if (!owner || !repo) {\n setGithubError(\"Invalid repo format. Use 'owner/repo' or GitHub URL\");\n return;\n }\n\n setGithubLoading(true);\n setGithubError(null);\n setGithubSkills([]);\n setGithubRepoInfo(null);\n\n try {\n const res = await authFetch(`/api/skills/github/${owner}/${repo}`);\n const data = await res.json();\n\n if (!res.ok) {\n setGithubError(data.error || \"Failed to fetch repository\");\n setGithubLoading(false);\n return;\n }\n\n setGithubSkills(data.skills || []);\n setGithubRepoInfo(data.repo || null);\n } catch (e) {\n setGithubError(\"Failed to fetch repository\");\n }\n setGithubLoading(false);\n };\n\n const installFromGitHub = async (skill: GitHubSkill) => {\n if (!githubRepoInfo) return;\n\n setInstallingGithub(skill.name);\n try {\n const res = await authFetch(\"/api/skills/github/install\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n owner: githubRepoInfo.owner,\n repo: githubRepoInfo.repo,\n skillName: skill.name,\n downloadUrl: skill.downloadUrl,\n projectId: githubProjectId,\n }),\n });\n\n const data = await res.json();\n if (res.ok) {\n await alert(`Installed \"${skill.name}\" successfully!`, { title: \"Skill Installed\" });\n fetchSkills();\n } else {\n await alert(data.error || \"Failed to install skill\", { title: \"Installation Failed\", variant: \"error\" });\n }\n } catch (e) {\n await alert(\"Failed to install skill\", { title: \"Error\", variant: \"error\" });\n }\n setInstallingGithub(null);\n };\n\n const installAllFromGitHub = async () => {\n if (!githubRepoInfo || githubSkills.length === 0) return;\n\n const uninstalled = githubSkills.filter(s => !isInstalled(s.name));\n if (uninstalled.length === 0) {\n await alert(\"All skills are already installed\", { title: \"Info\" });\n return;\n }\n\n const confirmed = await confirm(\n `Install ${uninstalled.length} skill(s) from ${githubRepoInfo.owner}/${githubRepoInfo.repo}?`,\n { confirmText: \"Install All\", title: \"Install Skills\" }\n );\n if (!confirmed) return;\n\n let installed = 0;\n for (const skill of uninstalled) {\n setInstallingGithub(skill.name);\n try {\n const res = await authFetch(\"/api/skills/github/install\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n owner: githubRepoInfo.owner,\n repo: githubRepoInfo.repo,\n skillName: skill.name,\n downloadUrl: skill.downloadUrl,\n projectId: githubProjectId,\n }),\n });\n if (res.ok) installed++;\n } catch (e) {\n // Continue with others\n }\n }\n setInstallingGithub(null);\n fetchSkills();\n await alert(`Installed ${installed} of ${uninstalled.length} skills`, { title: \"Installation Complete\" });\n };\n\n return (\n <>\n {ConfirmDialog}\n {AlertDialog}\n <div className=\"flex-1 overflow-auto p-6\">\n <div className=\"max-w-6xl\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-6\">\n <div>\n <h1 className=\"text-2xl font-semibold mb-1\">Skills</h1>\n <p className=\"text-[#666]\">\n Manage agent skills - instructions that teach agents how to perform tasks.\n </p>\n </div>\n {activeTab === \"installed\" && (\n <div className=\"flex gap-2\">\n <button\n onClick={() => setShowImport(true)}\n className=\"bg-[#1a1a1a] hover:bg-[#222] text-white px-4 py-2 rounded font-medium transition border border-[#333]\"\n >\n Import\n </button>\n <button\n onClick={() => setShowCreate(true)}\n className=\"bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition\"\n >\n + Create Skill\n </button>\n </div>\n )}\n </div>\n\n {/* Tabs */}\n <div className=\"flex gap-1 mb-6 bg-[#111] border border-[#1a1a1a] rounded-lg p-1 w-fit\">\n <button\n onClick={() => setActiveTab(\"installed\")}\n className={`px-4 py-2 rounded text-sm font-medium transition ${\n activeTab === \"installed\"\n ? \"bg-[#1a1a1a] text-white\"\n : \"text-[#666] hover:text-[#888]\"\n }`}\n >\n Installed ({filteredSkills.length})\n </button>\n <button\n onClick={() => setActiveTab(\"github\")}\n className={`px-4 py-2 rounded text-sm font-medium transition ${\n activeTab === \"github\"\n ? \"bg-[#1a1a1a] text-white\"\n : \"text-[#666] hover:text-[#888]\"\n }`}\n >\n Browse GitHub\n </button>\n <button\n onClick={() => setActiveTab(\"marketplace\")}\n className={`px-4 py-2 rounded text-sm font-medium transition ${\n activeTab === \"marketplace\"\n ? \"bg-[#1a1a1a] text-white\"\n : \"text-[#666] hover:text-[#888]\"\n }`}\n >\n Marketplace\n </button>\n </div>\n\n {/* Installed Tab */}\n {activeTab === \"installed\" && (\n <>\n {loading ? (\n <div className=\"text-[#666]\">Loading skills...</div>\n ) : skills.length === 0 ? (\n <div className=\"text-center py-20 text-[#666]\">\n <p className=\"text-lg\">No skills installed</p>\n <p className=\"text-sm mt-1\">Create a skill or browse the marketplace</p>\n <button\n onClick={() => setActiveTab(\"marketplace\")}\n className=\"mt-4 bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition\"\n >\n Browse Marketplace\n </button>\n </div>\n ) : filteredSkills.length === 0 ? (\n <div className=\"bg-[#111] border border-[#1a1a1a] rounded-lg p-6 text-center\">\n <p className=\"text-[#666]\">No skills match this filter.</p>\n </div>\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {filteredSkills.map((skill) => {\n const project = hasProjects && skill.project_id\n ? projects.find(p => p.id === skill.project_id)\n : null;\n return (\n <SkillCard\n key={skill.id}\n skill={skill}\n project={project}\n onToggle={() => toggleSkill(skill.id)}\n onDelete={() => deleteSkill(skill.id)}\n onView={() => setSelectedSkill(skill)}\n />\n );\n })}\n </div>\n )}\n </>\n )}\n\n {/* GitHub Tab */}\n {activeTab === \"github\" && (\n <div className=\"space-y-6\">\n {/* Search */}\n <form\n onSubmit={(e) => {\n e.preventDefault();\n browseGitHubRepo();\n }}\n className=\"flex gap-2\"\n >\n <input\n type=\"text\"\n value={githubRepo}\n onChange={(e) => setGithubRepo(e.target.value)}\n placeholder=\"Enter GitHub repo (e.g., WordPress/agent-skills)\"\n className=\"flex-1 bg-[#111] border border-[#333] rounded-lg px-4 py-3 focus:outline-none focus:border-[#f97316]\"\n />\n <button\n type=\"submit\"\n disabled={githubLoading}\n className=\"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition\"\n >\n {githubLoading ? \"...\" : \"Browse\"}\n </button>\n </form>\n\n {/* Project Scope Selector */}\n {hasProjects && githubSkills.length > 0 && (\n <div className=\"flex items-center gap-3 p-3 bg-[#0a0a0a] border border-[#222] rounded-lg\">\n <span className=\"text-sm text-[#666]\">Install to:</span>\n <Select\n value={githubProjectId || \"\"}\n onChange={(value) => setGithubProjectId(value || null)}\n options={[\n { value: \"\", label: \"Global (all projects)\" },\n ...projects.map(p => ({ value: p.id, label: p.name }))\n ]}\n placeholder=\"Select scope...\"\n />\n </div>\n )}\n\n {/* Error */}\n {githubError && (\n <div className=\"text-red-400 text-sm p-3 bg-red-500/10 border border-red-500/20 rounded-lg\">\n {githubError}\n </div>\n )}\n\n {/* Repo Info Header */}\n {githubRepoInfo && githubSkills.length > 0 && (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <a\n href={githubRepoInfo.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[#f97316] hover:underline font-medium\"\n >\n {githubRepoInfo.owner}/{githubRepoInfo.repo}\n </a>\n <span className=\"text-sm text-[#666]\">\n {githubSkills.length} skill{githubSkills.length !== 1 ? \"s\" : \"\"} found\n </span>\n </div>\n {githubSkills.some(s => !isInstalled(s.name)) && (\n <button\n onClick={installAllFromGitHub}\n disabled={!!installingGithub}\n className=\"text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-4 py-2 rounded transition disabled:opacity-50\"\n >\n Install All\n </button>\n )}\n </div>\n )}\n\n {/* Loading */}\n {githubLoading && (\n <div className=\"text-center py-8 text-[#666]\">\n Fetching skills from repository...\n </div>\n )}\n\n {/* Empty State */}\n {!githubLoading && !githubRepoInfo && !githubError && (\n <div className=\"bg-[#111] border border-[#1a1a1a] rounded-lg p-8 text-center\">\n <div className=\"text-4xl mb-4\">📦</div>\n <h3 className=\"text-lg font-medium mb-2\">Browse Skills from GitHub</h3>\n <p className=\"text-[#666] mb-6 max-w-md mx-auto\">\n Enter a GitHub repository to browse and install skills. Skills are markdown files with instructions that teach agents how to perform specific tasks.\n </p>\n <div className=\"flex flex-wrap gap-2 justify-center\">\n {[\n { label: \"WordPress Skills\", repo: \"WordPress/agent-skills\" },\n ].map(({ label, repo }) => (\n <button\n key={repo}\n onClick={() => {\n setGithubRepo(repo);\n browseGitHubRepo(repo);\n }}\n className=\"text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition\"\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* No Skills Found */}\n {!githubLoading && githubRepoInfo && githubSkills.length === 0 && (\n <div className=\"text-center py-8 text-[#666]\">\n No skills found in this repository. Skills should be in subdirectories with a SKILL.md file.\n </div>\n )}\n\n {/* Skills Grid */}\n {githubSkills.length > 0 && (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {githubSkills.map((skill) => {\n const installed = isInstalled(skill.name);\n const isInstalling = installingGithub === skill.name;\n\n return (\n <div\n key={skill.name}\n className={`bg-[#111] border rounded-lg p-4 transition ${\n installed ? \"border-green-500/30\" : \"border-[#1a1a1a] hover:border-[#333]\"\n }`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-medium truncate\">{skill.name}</h3>\n {installed && (\n <span className=\"text-xs text-green-400\">✓ Installed</span>\n )}\n </div>\n <p className=\"text-sm text-[#666] mt-1 line-clamp-2\">\n {skill.description || \"No description\"}\n </p>\n <div className=\"flex items-center gap-2 mt-2 text-xs text-[#555]\">\n <span>{(skill.size / 1024).toFixed(1)}KB</span>\n <span className=\"px-1.5 py-0.5 rounded bg-blue-500/10 text-blue-400\">\n GitHub\n </span>\n </div>\n </div>\n <div className=\"flex-shrink-0\">\n {installed ? (\n <span className=\"text-xs text-[#555] px-3 py-1.5\">Added</span>\n ) : (\n <button\n onClick={() => installFromGitHub(skill)}\n disabled={isInstalling}\n className=\"text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition disabled:opacity-50\"\n >\n {isInstalling ? \"Installing...\" : \"Install\"}\n </button>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Info */}\n <div className=\"p-4 bg-[#111] border border-[#1a1a1a] rounded-lg text-sm text-[#666]\">\n <p>\n Skills are sourced from GitHub repositories. Each skill should be in its own directory with a{\" \"}\n <code className=\"text-[#888] bg-[#0a0a0a] px-1 rounded\">SKILL.md</code> file containing instructions.\n </p>\n </div>\n </div>\n )}\n\n {/* Marketplace Tab */}\n {activeTab === \"marketplace\" && (\n <>\n {/* Search */}\n <div className=\"mb-6\">\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && searchMarketplace()}\n placeholder=\"Search skills...\"\n className=\"flex-1 bg-[#111] border border-[#1a1a1a] rounded px-4 py-2 focus:outline-none focus:border-[#f97316]\"\n />\n <button\n onClick={() => searchMarketplace()}\n disabled={marketplaceLoading}\n className=\"bg-[#1a1a1a] hover:bg-[#222] text-white px-4 py-2 rounded font-medium transition border border-[#333]\"\n >\n {marketplaceLoading ? \"...\" : \"Search\"}\n </button>\n </div>\n </div>\n\n {marketplaceLoading ? (\n <div className=\"text-[#666]\">Loading...</div>\n ) : marketplaceSkills.length === 0 ? (\n <div className=\"text-center py-20 text-[#666]\">\n <p className=\"text-lg\">No skills found</p>\n <p className=\"text-sm mt-1\">Try a different search term</p>\n </div>\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {marketplaceSkills.map((skill) => (\n <MarketplaceSkillCard\n key={skill.id}\n skill={skill}\n installed={isInstalled(skill.name)}\n installing={installing === skill.id}\n onInstall={() => installFromMarketplace(skill)}\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Create Modal */}\n {showCreate && (\n <CreateSkillModal\n authFetch={authFetch}\n onClose={() => setShowCreate(false)}\n onCreated={() => {\n setShowCreate(false);\n fetchSkills();\n }}\n projects={hasProjects ? projects : undefined}\n defaultProjectId={currentProjectId && currentProjectId !== \"unassigned\" ? currentProjectId : null}\n />\n )}\n\n {/* Import Modal */}\n {showImport && (\n <ImportSkillModal\n authFetch={authFetch}\n onClose={() => setShowImport(false)}\n onImported={() => {\n setShowImport(false);\n fetchSkills();\n }}\n />\n )}\n\n {/* View/Edit Modal */}\n {selectedSkill && (\n <ViewSkillModal\n skill={selectedSkill}\n authFetch={authFetch}\n onClose={() => setSelectedSkill(null)}\n onUpdated={() => {\n setSelectedSkill(null);\n fetchSkills();\n }}\n />\n )}\n </>\n );\n}\n\nfunction SkillCard({\n skill,\n project,\n onToggle,\n onDelete,\n onView,\n}: {\n skill: Skill;\n project?: { id: string; name: string; color: string } | null;\n onToggle: () => void;\n onDelete: () => void;\n onView: () => void;\n}) {\n const sourceLabel = {\n local: \"Local\",\n skillsmp: \"SkillsMP\",\n github: \"GitHub\",\n import: \"Imported\",\n }[skill.source];\n\n // Scope badge: Global or Project name\n const getScopeBadge = () => {\n if (project) {\n return (\n <span\n className=\"text-xs px-1.5 py-0.5 rounded\"\n style={{ backgroundColor: `${project.color}20`, color: project.color }}\n >\n {project.name}\n </span>\n );\n }\n if (skill.project_id === null) {\n return (\n <span className=\"text-xs text-[#666] bg-[#1a1a1a] px-1.5 py-0.5 rounded\">\n Global\n </span>\n );\n }\n return null;\n };\n\n return (\n <div\n className={`bg-[#111] rounded-lg p-5 border transition cursor-pointer ${\n skill.enabled ? \"border-[#1a1a1a]\" : \"border-[#1a1a1a] opacity-60\"\n } hover:border-[#333]`}\n onClick={onView}\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-lg truncate\">{skill.name}</h3>\n {getScopeBadge()}\n </div>\n <p className=\"text-xs text-[#666] flex items-center gap-2 mt-0.5\">\n <span className={`px-1.5 py-0.5 rounded text-[10px] ${\n skill.source === \"skillsmp\" ? \"bg-purple-500/20 text-purple-400\" :\n skill.source === \"github\" ? \"bg-blue-500/20 text-blue-400\" :\n \"bg-[#222] text-[#888]\"\n }`}>\n {sourceLabel}\n </span>\n {skill.metadata?.version && <span>v{skill.metadata.version}</span>}\n </p>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n className={`w-10 h-5 rounded-full transition-colors relative ${\n skill.enabled ? \"bg-[#f97316]\" : \"bg-[#333]\"\n }`}\n >\n <span\n className={`absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform ${\n skill.enabled ? \"left-5\" : \"left-0.5\"\n }`}\n />\n </button>\n </div>\n\n <p className=\"text-sm text-[#888] line-clamp-2 mb-4\">{skill.description}</p>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1 flex-wrap\">\n {skill.allowed_tools.slice(0, 2).map((tool) => (\n <span key={tool} className=\"text-xs bg-[#222] px-2 py-0.5 rounded text-[#666]\">\n {tool}\n </span>\n ))}\n {skill.allowed_tools.length > 2 && (\n <span className=\"text-xs text-[#666]\">+{skill.allowed_tools.length - 2}</span>\n )}\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className=\"text-red-400 hover:text-red-300 text-sm\"\n >\n Delete\n </button>\n </div>\n </div>\n );\n}\n\nfunction MarketplaceSkillCard({\n skill,\n installed,\n installing,\n onInstall,\n}: {\n skill: MarketplaceSkill;\n installed: boolean;\n installing: boolean;\n onInstall: () => void;\n}) {\n return (\n <div className=\"bg-[#111] rounded-lg p-5 border border-[#1a1a1a] hover:border-[#333] transition\">\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-lg truncate\">{skill.name}</h3>\n <p className=\"text-xs text-[#666] mt-0.5\">\n by {skill.author} · v{skill.version}\n </p>\n </div>\n <div className=\"flex items-center gap-1 text-yellow-500 text-sm\">\n ★ {skill.rating.toFixed(1)}\n </div>\n </div>\n\n <p className=\"text-sm text-[#888] line-clamp-2 mb-4\">{skill.description}</p>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1 flex-wrap\">\n {skill.tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"text-xs bg-[#222] px-2 py-0.5 rounded text-[#666]\">\n {tag}\n </span>\n ))}\n </div>\n {installed ? (\n <span className=\"text-green-400 text-sm\">✓ Installed</span>\n ) : (\n <button\n onClick={onInstall}\n disabled={installing}\n className=\"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-3 py-1 rounded text-sm font-medium transition\"\n >\n {installing ? \"Installing...\" : \"Install\"}\n </button>\n )}\n </div>\n\n <div className=\"mt-3 text-xs text-[#555]\">\n {skill.downloads.toLocaleString()} downloads\n </div>\n </div>\n );\n}\n\nfunction CreateSkillModal({\n authFetch,\n onClose,\n onCreated,\n projects,\n defaultProjectId,\n}: {\n authFetch: (url: string, options?: RequestInit) => Promise<Response>;\n onClose: () => void;\n onCreated: () => void;\n projects?: Array<{ id: string; name: string; color: string }>;\n defaultProjectId?: string | null;\n}) {\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [projectId, setProjectId] = useState<string | null>(defaultProjectId || null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const hasProjects = projects && projects.length > 0;\n\n const handleSave = async () => {\n if (!name || !description || !content) {\n setError(\"All fields are required\");\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n const body: Record<string, unknown> = {\n name,\n description,\n content, // Just the instructions, not wrapped in frontmatter\n source: \"local\",\n };\n\n // Add project_id if selected\n if (projectId) {\n body.project_id = projectId;\n }\n\n const res = await authFetch(\"/api/skills\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const data = await res.json();\n if (!res.ok) {\n setError(data.error || \"Failed to create skill\");\n setSaving(false);\n return;\n }\n\n onCreated();\n } catch (e) {\n setError(\"Failed to create skill\");\n setSaving(false);\n }\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4\" onClick={onClose}>\n <div\n className=\"bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-6 border-b border-[#1a1a1a]\">\n <h2 className=\"text-xl font-semibold\">Create Skill</h2>\n </div>\n\n <div className=\"p-6 space-y-4\">\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/30 rounded p-3 text-red-400 text-sm\">\n {error}\n </div>\n )}\n\n <div>\n <label className=\"block text-sm text-[#888] mb-1\">Name</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, \"-\"))}\n placeholder=\"my-skill-name\"\n className=\"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]\"\n />\n <p className=\"text-xs text-[#555] mt-1\">Lowercase letters, numbers, and hyphens only</p>\n </div>\n\n <div>\n <label className=\"block text-sm text-[#888] mb-1\">Description</label>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What this skill does and when to use it...\"\n className=\"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]\"\n />\n </div>\n\n {/* Project Scope - only show when projects exist */}\n {hasProjects && (\n <div>\n <label className=\"block text-sm text-[#888] mb-1\">Scope</label>\n <Select\n value={projectId || \"\"}\n onChange={(value) => setProjectId(value || null)}\n options={[\n { value: \"\", label: \"Global (all projects)\" },\n ...projects!.map(p => ({ value: p.id, label: p.name }))\n ]}\n placeholder=\"Select scope...\"\n />\n <p className=\"text-xs text-[#555] mt-1\">\n Global skills are available to all agents. Project-scoped skills are only available to agents in that project.\n </p>\n </div>\n )}\n\n <div>\n <label className=\"block text-sm text-[#888] mb-1\">Instructions (Markdown)</label>\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"# Skill Instructions&#10;&#10;Write detailed instructions here...\"\n rows={12}\n className=\"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm\"\n />\n </div>\n </div>\n\n <div className=\"p-6 border-t border-[#1a1a1a] flex justify-end gap-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-[#888] hover:text-white transition\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition\"\n >\n {saving ? \"Creating...\" : \"Create Skill\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ImportSkillModal({\n authFetch,\n onClose,\n onImported,\n}: {\n authFetch: (url: string, options?: RequestInit) => Promise<Response>;\n onClose: () => void;\n onImported: () => void;\n}) {\n const [content, setContent] = useState(\"\");\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleImport = async () => {\n if (!content.trim()) {\n setError(\"Paste SKILL.md content\");\n return;\n }\n\n setImporting(true);\n setError(null);\n\n try {\n const res = await authFetch(\"/api/skills/import\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content }),\n });\n\n const data = await res.json();\n if (!res.ok) {\n setError(data.error || \"Failed to import skill\");\n setImporting(false);\n return;\n }\n\n onImported();\n } catch (e) {\n setError(\"Failed to import skill\");\n setImporting(false);\n }\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4\" onClick={onClose}>\n <div\n className=\"bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-6 border-b border-[#1a1a1a]\">\n <h2 className=\"text-xl font-semibold\">Import Skill</h2>\n <p className=\"text-sm text-[#666] mt-1\">Paste the contents of a SKILL.md file</p>\n </div>\n\n <div className=\"p-6 space-y-4\">\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/30 rounded p-3 text-red-400 text-sm\">\n {error}\n </div>\n )}\n\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={`---\nname: skill-name\ndescription: What this skill does...\n---\n\n# Instructions\n\nYour skill instructions here...`}\n rows={16}\n className=\"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm\"\n />\n </div>\n\n <div className=\"p-6 border-t border-[#1a1a1a] flex justify-end gap-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-[#888] hover:text-white transition\"\n >\n Cancel\n </button>\n <button\n onClick={handleImport}\n disabled={importing}\n className=\"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition\"\n >\n {importing ? \"Importing...\" : \"Import Skill\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ViewSkillModal({\n skill,\n authFetch,\n onClose,\n onUpdated,\n}: {\n skill: Skill;\n authFetch: (url: string, options?: RequestInit) => Promise<Response>;\n onClose: () => void;\n onUpdated: () => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [content, setContent] = useState(skill.content);\n const [saving, setSaving] = useState(false);\n\n const handleSave = async () => {\n setSaving(true);\n try {\n await authFetch(`/api/skills/${skill.id}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content }),\n });\n onUpdated();\n } catch (e) {\n console.error(\"Failed to save:\", e);\n }\n setSaving(false);\n };\n\n const handleExport = async () => {\n try {\n const res = await authFetch(`/api/skills/${skill.id}/export`);\n const text = await res.text();\n const blob = new Blob([text], { type: \"text/markdown\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${skill.name}-SKILL.md`;\n a.click();\n URL.revokeObjectURL(url);\n } catch (e) {\n console.error(\"Failed to export:\", e);\n }\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4\" onClick={onClose}>\n <div\n className=\"bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-3xl max-h-[90vh] overflow-auto\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-6 border-b border-[#1a1a1a] flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-semibold\">{skill.name}</h2>\n <p className=\"text-sm text-[#666] mt-0.5\">{skill.description}</p>\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={handleExport}\n className=\"text-sm text-[#888] hover:text-white transition px-3 py-1 rounded border border-[#333]\"\n >\n Export\n </button>\n <button\n onClick={() => setEditing(!editing)}\n className=\"text-sm text-[#888] hover:text-white transition px-3 py-1 rounded border border-[#333]\"\n >\n {editing ? \"View\" : \"Edit\"}\n </button>\n </div>\n </div>\n\n <div className=\"p-6\">\n {editing ? (\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n rows={20}\n className=\"w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm\"\n />\n ) : (\n <pre className=\"bg-[#0a0a0a] border border-[#222] rounded p-4 font-mono text-sm overflow-auto max-h-[60vh] whitespace-pre-wrap\">\n {skill.content}\n </pre>\n )}\n </div>\n\n <div className=\"p-6 border-t border-[#1a1a1a] flex justify-between\">\n <div className=\"text-xs text-[#555]\">\n {skill.source !== \"local\" && skill.source_url && (\n <a href={skill.source_url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-[#f97316] hover:underline\">\n View source →\n </a>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-[#888] hover:text-white transition\"\n >\n Close\n </button>\n {editing && (\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition\"\n >\n {saving ? \"Saving...\" : \"Save Changes\"}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "AAB8FFD9C3B0D3B464756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,20 @@
1
+ var rW=Object.create;var{getPrototypeOf:aW,defineProperty:bW,getOwnPropertyNames:tW}=Object;var eW=Object.prototype.hasOwnProperty;var r=(H,w,q)=>{q=H!=null?rW(aW(H)):{};let R=w||!H||!H.__esModule?bW(q,"default",{value:H,enumerable:!0}):q;for(let m of tW(H))if(!eW.call(R,m))bW(R,m,{get:()=>H[m],enumerable:!0});return R};var fW=(H,w)=>()=>(w||H((w={exports:{}}).exports,w),w.exports);var JZ=((H)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(H,{get:(w,q)=>(typeof require<"u"?require:w)[q]}):H)(function(H){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+H+'" is not supported')});var UW=fW((WZ,RW)=>{(function(){function H(W,Z){Object.defineProperty(R.prototype,W,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",Z[0],Z[1])}})}function w(W){if(W===null||typeof W!=="object")return null;return W=PW&&W[PW]||W["@@iterator"],typeof W==="function"?W:null}function q(W,Z){W=(W=W.constructor)&&(W.displayName||W.name)||"ReactClass";var B=W+"."+Z;EW[B]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",Z,W),EW[B]=!0)}function R(W,Z,B){this.props=W,this.context=Z,this.refs=FW,this.updater=B||xW}function m(){}function S(W,Z,B){this.props=W,this.context=Z,this.refs=FW,this.updater=B||xW}function j(){}function T(W){return""+W}function g(W){try{T(W);var Z=!1}catch(Y){Z=!0}if(Z){Z=console;var B=Z.error,G=typeof Symbol==="function"&&Symbol.toStringTag&&W[Symbol.toStringTag]||W.constructor.name||"Object";return B.call(Z,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",G),T(W)}}function u(W){if(W==null)return null;if(typeof W==="function")return W.$$typeof===iW?null:W.displayName||W.name||null;if(typeof W==="string")return W;switch(W){case HW:return"Fragment";case U:return"Profiler";case X:return"StrictMode";case MW:return"Suspense";case A:return"SuspenseList";case DW:return"Activity"}if(typeof W==="object")switch(typeof W.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),W.$$typeof){case OW:return"Portal";case f:return W.displayName||"Context";case P:return(W._context.displayName||"Context")+".Consumer";case l:var Z=W.render;return W=W.displayName,W||(W=Z.displayName||Z.name||"",W=W!==""?"ForwardRef("+W+")":"ForwardRef"),W;case n:return Z=W.displayName||null,Z!==null?Z:u(W.type)||"Memo";case t:Z=W._payload,W=W._init;try{return u(W(Z))}catch(B){}}return null}function c(W){if(W===HW)return"<>";if(typeof W==="object"&&W!==null&&W.$$typeof===t)return"<...>";try{var Z=u(W);return Z?"<"+Z+">":"<...>"}catch(B){return"<...>"}}function p(){var W=O.A;return W===null?null:W.getOwner()}function d(){return Error("react-stack-top-frame")}function s(W){if(JW.call(W,"key")){var Z=Object.getOwnPropertyDescriptor(W,"key").get;if(Z&&Z.isReactWarning)return!1}return W.key!==void 0}function y(W,Z){function B(){jW||(jW=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",Z))}B.isReactWarning=!0,Object.defineProperty(W,"key",{get:B,configurable:!0})}function k(){var W=u(this.type);return vW[W]||(vW[W]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),W=this.props.ref,W!==void 0?W:null}function F(W,Z,B,G,Y,D){var $=B.ref;return W={$$typeof:QW,type:W,key:Z,props:B,_owner:G},($!==void 0?$:null)!==null?Object.defineProperty(W,"ref",{enumerable:!1,get:k}):Object.defineProperty(W,"ref",{enumerable:!1,value:null}),W._store={},Object.defineProperty(W._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(W,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(W,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Y}),Object.defineProperty(W,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:D}),Object.freeze&&(Object.freeze(W.props),Object.freeze(W)),W}function b(W,Z){return Z=F(W.type,Z,W.props,W._owner,W._debugStack,W._debugTask),W._store&&(Z._store.validated=W._store.validated),Z}function h(W){v(W)?W._store&&(W._store.validated=1):typeof W==="object"&&W!==null&&W.$$typeof===t&&(W._payload.status==="fulfilled"?v(W._payload.value)&&W._payload.value._store&&(W._payload.value._store.validated=1):W._store&&(W._store.validated=1))}function v(W){return typeof W==="object"&&W!==null&&W.$$typeof===QW}function _(W){var Z={"=":"=0",":":"=2"};return"$"+W.replace(/[=:]/g,function(B){return Z[B]})}function C(W,Z){return typeof W==="object"&&W!==null&&W.key!=null?(g(W.key),_(""+W.key)):Z.toString(36)}function L(W){switch(W.status){case"fulfilled":return W.value;case"rejected":throw W.reason;default:switch(typeof W.status==="string"?W.then(j,j):(W.status="pending",W.then(function(Z){W.status==="pending"&&(W.status="fulfilled",W.value=Z)},function(Z){W.status==="pending"&&(W.status="rejected",W.reason=Z)})),W.status){case"fulfilled":return W.value;case"rejected":throw W.reason}}throw W}function x(W,Z,B,G,Y){var D=typeof W;if(D==="undefined"||D==="boolean")W=null;var $=!1;if(W===null)$=!0;else switch(D){case"bigint":case"string":case"number":$=!0;break;case"object":switch(W.$$typeof){case QW:case OW:$=!0;break;case t:return $=W._init,x($(W._payload),Z,B,G,Y)}}if($){$=W,Y=Y($);var K=G===""?"."+C($,0):G;return AW(Y)?(B="",K!=null&&(B=K.replace(SW,"$&/")+"/"),x(Y,Z,B,"",function(e){return e})):Y!=null&&(v(Y)&&(Y.key!=null&&($&&$.key===Y.key||g(Y.key)),B=b(Y,B+(Y.key==null||$&&$.key===Y.key?"":(""+Y.key).replace(SW,"$&/")+"/")+K),G!==""&&$!=null&&v($)&&$.key==null&&$._store&&!$._store.validated&&(B._store.validated=2),Y=B),Z.push(Y)),1}if($=0,K=G===""?".":G+":",AW(W))for(var J=0;J<W.length;J++)G=W[J],D=K+C(G,J),$+=x(G,Z,B,D,Y);else if(J=w(W),typeof J==="function")for(J===W.entries&&(CW||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),CW=!0),W=J.call(W),J=0;!(G=W.next()).done;)G=G.value,D=K+C(G,J++),$+=x(G,Z,B,D,Y);else if(D==="object"){if(typeof W.then==="function")return x(L(W),Z,B,G,Y);throw Z=String(W),Error("Objects are not valid as a React child (found: "+(Z==="[object Object]"?"object with keys {"+Object.keys(W).join(", ")+"}":Z)+"). If you meant to render a collection of children, use an array instead.")}return $}function z(W,Z,B){if(W==null)return W;var G=[],Y=0;return x(W,G,"","",function(D){return Z.call(B,D,Y++)}),G}function Q(W){if(W._status===-1){var Z=W._ioInfo;Z!=null&&(Z.start=Z.end=performance.now()),Z=W._result;var B=Z();if(B.then(function(Y){if(W._status===0||W._status===-1){W._status=1,W._result=Y;var D=W._ioInfo;D!=null&&(D.end=performance.now()),B.status===void 0&&(B.status="fulfilled",B.value=Y)}},function(Y){if(W._status===0||W._status===-1){W._status=2,W._result=Y;var D=W._ioInfo;D!=null&&(D.end=performance.now()),B.status===void 0&&(B.status="rejected",B.reason=Y)}}),Z=W._ioInfo,Z!=null){Z.value=B;var G=B.displayName;typeof G==="string"&&(Z.name=G)}W._status===-1&&(W._status=0,W._result=B)}if(W._status===1)return Z=W._result,Z===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
2
+
3
+ Your code should look like:
4
+ const MyComponent = lazy(() => import('./MyComponent'))
5
+
6
+ Did you accidentally put curly braces around the import?`,Z),"default"in Z||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
7
+
8
+ Your code should look like:
9
+ const MyComponent = lazy(() => import('./MyComponent'))`,Z),Z.default;throw W._result}function M(){var W=O.H;return W===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
10
+ 1. You might have mismatching versions of React and the renderer (such as React DOM)
11
+ 2. You might be breaking the Rules of Hooks
12
+ 3. You might have more than one copy of React in the same app
13
+ See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),W}function N(){O.asyncTransitions--}function o(W){if(LW===null)try{var Z=("require"+Math.random()).slice(0,7);LW=(RW&&RW[Z]).call(RW,"timers").setImmediate}catch(B){LW=function(G){kW===!1&&(kW=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var Y=new MessageChannel;Y.port1.onmessage=G,Y.port2.postMessage(void 0)}}return LW(W)}function a(W){return 1<W.length&&typeof AggregateError==="function"?AggregateError(W):W[0]}function WW(W,Z){Z!==qW-1&&console.error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "),qW=Z}function BW(W,Z,B){var G=O.actQueue;if(G!==null)if(G.length!==0)try{GW(G),o(function(){return BW(W,Z,B)});return}catch(Y){O.thrownErrors.push(Y)}else O.actQueue=null;0<O.thrownErrors.length?(G=a(O.thrownErrors),O.thrownErrors.length=0,B(G)):Z(W)}function GW(W){if(!VW){VW=!0;var Z=0;try{for(;Z<W.length;Z++){var B=W[Z];do{O.didUsePromise=!1;var G=B(!1);if(G!==null){if(O.didUsePromise){W[Z]=B,W.splice(0,Z);return}B=G}else break}while(1)}W.length=0}catch(Y){W.splice(0,Z+1),O.thrownErrors.push(Y)}finally{VW=!1}}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var QW=Symbol.for("react.transitional.element"),OW=Symbol.for("react.portal"),HW=Symbol.for("react.fragment"),X=Symbol.for("react.strict_mode"),U=Symbol.for("react.profiler"),P=Symbol.for("react.consumer"),f=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),MW=Symbol.for("react.suspense"),A=Symbol.for("react.suspense_list"),n=Symbol.for("react.memo"),t=Symbol.for("react.lazy"),DW=Symbol.for("react.activity"),PW=Symbol.iterator,EW={},xW={isMounted:function(){return!1},enqueueForceUpdate:function(W){q(W,"forceUpdate")},enqueueReplaceState:function(W){q(W,"replaceState")},enqueueSetState:function(W){q(W,"setState")}},_W=Object.assign,FW={};Object.freeze(FW),R.prototype.isReactComponent={},R.prototype.setState=function(W,Z){if(typeof W!=="object"&&typeof W!=="function"&&W!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,W,Z,"setState")},R.prototype.forceUpdate=function(W){this.updater.enqueueForceUpdate(this,W,"forceUpdate")};var i={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]};for($W in i)i.hasOwnProperty($W)&&H($W,i[$W]);m.prototype=R.prototype,i=S.prototype=new m,i.constructor=S,_W(i,R.prototype),i.isPureReactComponent=!0;var AW=Array.isArray,iW=Symbol.for("react.client.reference"),O={H:null,A:null,T:null,S:null,actQueue:null,asyncTransitions:0,isBatchingLegacy:!1,didScheduleLegacyUpdate:!1,didUsePromise:!1,thrownErrors:[],getCurrentStack:null,recentlyCreatedOwnerStacks:0},JW=Object.prototype.hasOwnProperty,IW=console.createTask?console.createTask:function(){return null};i={react_stack_bottom_frame:function(W){return W()}};var jW,TW,vW={},oW=i.react_stack_bottom_frame.bind(i,d)(),cW=IW(c(d)),CW=!1,SW=/\/+/g,gW=typeof reportError==="function"?reportError:function(W){if(typeof window==="object"&&typeof window.ErrorEvent==="function"){var Z=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof W==="object"&&W!==null&&typeof W.message==="string"?String(W.message):String(W),error:W});if(!window.dispatchEvent(Z))return}else if(typeof process==="object"&&typeof process.emit==="function"){process.emit("uncaughtException",W);return}console.error(W)},kW=!1,LW=null,qW=0,wW=!1,VW=!1,mW=typeof queueMicrotask==="function"?function(W){queueMicrotask(function(){return queueMicrotask(W)})}:o;i=Object.freeze({__proto__:null,c:function(W){return M().useMemoCache(W)}});var $W={map:z,forEach:function(W,Z,B){z(W,function(){Z.apply(this,arguments)},B)},count:function(W){var Z=0;return z(W,function(){Z++}),Z},toArray:function(W){return z(W,function(Z){return Z})||[]},only:function(W){if(!v(W))throw Error("React.Children.only expected to receive a single React element child.");return W}};WZ.Activity=DW,WZ.Children=$W,WZ.Component=R,WZ.Fragment=HW,WZ.Profiler=U,WZ.PureComponent=S,WZ.StrictMode=X,WZ.Suspense=MW,WZ.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=O,WZ.__COMPILER_RUNTIME=i,WZ.act=function(W){var Z=O.actQueue,B=qW;qW++;var G=O.actQueue=Z!==null?Z:[],Y=!1;try{var D=W()}catch(J){O.thrownErrors.push(J)}if(0<O.thrownErrors.length)throw WW(Z,B),W=a(O.thrownErrors),O.thrownErrors.length=0,W;if(D!==null&&typeof D==="object"&&typeof D.then==="function"){var $=D;return mW(function(){Y||wW||(wW=!0,console.error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(J,e){Y=!0,$.then(function(YW){if(WW(Z,B),B===0){try{GW(G),o(function(){return BW(YW,J,e)})}catch(nW){O.thrownErrors.push(nW)}if(0<O.thrownErrors.length){var lW=a(O.thrownErrors);O.thrownErrors.length=0,e(lW)}}else J(YW)},function(YW){WW(Z,B),0<O.thrownErrors.length?(YW=a(O.thrownErrors),O.thrownErrors.length=0,e(YW)):e(YW)})}}}var K=D;if(WW(Z,B),B===0&&(GW(G),G.length!==0&&mW(function(){Y||wW||(wW=!0,console.error("A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)"))}),O.actQueue=null),0<O.thrownErrors.length)throw W=a(O.thrownErrors),O.thrownErrors.length=0,W;return{then:function(J,e){Y=!0,B===0?(O.actQueue=G,o(function(){return BW(K,J,e)})):J(K)}}},WZ.cache=function(W){return function(){return W.apply(null,arguments)}},WZ.cacheSignal=function(){return null},WZ.captureOwnerStack=function(){var W=O.getCurrentStack;return W===null?null:W()},WZ.cloneElement=function(W,Z,B){if(W===null||W===void 0)throw Error("The argument must be a React element, but you passed "+W+".");var G=_W({},W.props),Y=W.key,D=W._owner;if(Z!=null){var $;W:{if(JW.call(Z,"ref")&&($=Object.getOwnPropertyDescriptor(Z,"ref").get)&&$.isReactWarning){$=!1;break W}$=Z.ref!==void 0}$&&(D=p()),s(Z)&&(g(Z.key),Y=""+Z.key);for(K in Z)!JW.call(Z,K)||K==="key"||K==="__self"||K==="__source"||K==="ref"&&Z.ref===void 0||(G[K]=Z[K])}var K=arguments.length-2;if(K===1)G.children=B;else if(1<K){$=Array(K);for(var J=0;J<K;J++)$[J]=arguments[J+2];G.children=$}G=F(W.type,Y,G,D,W._debugStack,W._debugTask);for(Y=2;Y<arguments.length;Y++)h(arguments[Y]);return G},WZ.createContext=function(W){return W={$$typeof:f,_currentValue:W,_currentValue2:W,_threadCount:0,Provider:null,Consumer:null},W.Provider=W,W.Consumer={$$typeof:P,_context:W},W._currentRenderer=null,W._currentRenderer2=null,W},WZ.createElement=function(W,Z,B){for(var G=2;G<arguments.length;G++)h(arguments[G]);G={};var Y=null;if(Z!=null)for(J in TW||!("__self"in Z)||"key"in Z||(TW=!0,console.warn("Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform")),s(Z)&&(g(Z.key),Y=""+Z.key),Z)JW.call(Z,J)&&J!=="key"&&J!=="__self"&&J!=="__source"&&(G[J]=Z[J]);var D=arguments.length-2;if(D===1)G.children=B;else if(1<D){for(var $=Array(D),K=0;K<D;K++)$[K]=arguments[K+2];Object.freeze&&Object.freeze($),G.children=$}if(W&&W.defaultProps)for(J in D=W.defaultProps,D)G[J]===void 0&&(G[J]=D[J]);Y&&y(G,typeof W==="function"?W.displayName||W.name||"Unknown":W);var J=1e4>O.recentlyCreatedOwnerStacks++;return F(W,Y,G,p(),J?Error("react-stack-top-frame"):oW,J?IW(c(W)):cW)},WZ.createRef=function(){var W={current:null};return Object.seal(W),W},WZ.forwardRef=function(W){W!=null&&W.$$typeof===n?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof W!=="function"?console.error("forwardRef requires a render function but was given %s.",W===null?"null":typeof W):W.length!==0&&W.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",W.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),W!=null&&W.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var Z={$$typeof:l,render:W},B;return Object.defineProperty(Z,"displayName",{enumerable:!1,configurable:!0,get:function(){return B},set:function(G){B=G,W.name||W.displayName||(Object.defineProperty(W,"name",{value:G}),W.displayName=G)}}),Z},WZ.isValidElement=v,WZ.lazy=function(W){W={_status:-1,_result:W};var Z={$$typeof:t,_payload:W,_init:Q},B={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return W._ioInfo=B,Z._debugInfo=[{awaited:B}],Z},WZ.memo=function(W,Z){W==null&&console.error("memo: The first argument must be a component. Instead received: %s",W===null?"null":typeof W),Z={$$typeof:n,type:W,compare:Z===void 0?null:Z};var B;return Object.defineProperty(Z,"displayName",{enumerable:!1,configurable:!0,get:function(){return B},set:function(G){B=G,W.name||W.displayName||(Object.defineProperty(W,"name",{value:G}),W.displayName=G)}}),Z},WZ.startTransition=function(W){var Z=O.T,B={};B._updatedFibers=new Set,O.T=B;try{var G=W(),Y=O.S;Y!==null&&Y(B,G),typeof G==="object"&&G!==null&&typeof G.then==="function"&&(O.asyncTransitions++,G.then(N,N),G.then(j,gW))}catch(D){gW(D)}finally{Z===null&&B._updatedFibers&&(W=B._updatedFibers.size,B._updatedFibers.clear(),10<W&&console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.")),Z!==null&&B.types!==null&&(Z.types!==null&&Z.types!==B.types&&console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."),Z.types=B.types),O.T=Z}},WZ.unstable_useCacheRefresh=function(){return M().useCacheRefresh()},WZ.use=function(W){return M().use(W)},WZ.useActionState=function(W,Z,B){return M().useActionState(W,Z,B)},WZ.useCallback=function(W,Z){return M().useCallback(W,Z)},WZ.useContext=function(W){var Z=M();return W.$$typeof===P&&console.error("Calling useContext(Context.Consumer) is not supported and will cause bugs. Did you mean to call useContext(Context) instead?"),Z.useContext(W)},WZ.useDebugValue=function(W,Z){return M().useDebugValue(W,Z)},WZ.useDeferredValue=function(W,Z){return M().useDeferredValue(W,Z)},WZ.useEffect=function(W,Z){return W==null&&console.warn("React Hook useEffect requires an effect callback. Did you forget to pass a callback to the hook?"),M().useEffect(W,Z)},WZ.useEffectEvent=function(W){return M().useEffectEvent(W)},WZ.useId=function(){return M().useId()},WZ.useImperativeHandle=function(W,Z,B){return M().useImperativeHandle(W,Z,B)},WZ.useInsertionEffect=function(W,Z){return W==null&&console.warn("React Hook useInsertionEffect requires an effect callback. Did you forget to pass a callback to the hook?"),M().useInsertionEffect(W,Z)},WZ.useLayoutEffect=function(W,Z){return W==null&&console.warn("React Hook useLayoutEffect requires an effect callback. Did you forget to pass a callback to the hook?"),M().useLayoutEffect(W,Z)},WZ.useMemo=function(W,Z){return M().useMemo(W,Z)},WZ.useOptimistic=function(W,Z){return M().useOptimistic(W,Z)},WZ.useReducer=function(W,Z,B){return M().useReducer(W,Z,B)},WZ.useRef=function(W){return M().useRef(W)},WZ.useState=function(W){return M().useState(W)},WZ.useSyncExternalStore=function(W,Z,B){return M().useSyncExternalStore(W,Z,B)},WZ.useTransition=function(){return M().useTransition()},WZ.version="19.2.4",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var XW=fW((ZZ)=>{var ZW=r(UW());(function(){function H(X){if(X==null)return null;if(typeof X==="function")return X.$$typeof===M?null:X.displayName||X.name||null;if(typeof X==="string")return X;switch(X){case k:return"Fragment";case b:return"Profiler";case F:return"StrictMode";case C:return"Suspense";case L:return"SuspenseList";case Q:return"Activity"}if(typeof X==="object")switch(typeof X.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),X.$$typeof){case y:return"Portal";case v:return X.displayName||"Context";case h:return(X._context.displayName||"Context")+".Consumer";case _:var U=X.render;return X=X.displayName,X||(X=U.displayName||U.name||"",X=X!==""?"ForwardRef("+X+")":"ForwardRef"),X;case x:return U=X.displayName||null,U!==null?U:H(X.type)||"Memo";case z:U=X._payload,X=X._init;try{return H(X(U))}catch(P){}}return null}function w(X){return""+X}function q(X){try{w(X);var U=!1}catch(l){U=!0}if(U){U=console;var P=U.error,f=typeof Symbol==="function"&&Symbol.toStringTag&&X[Symbol.toStringTag]||X.constructor.name||"Object";return P.call(U,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",f),w(X)}}function R(X){if(X===k)return"<>";if(typeof X==="object"&&X!==null&&X.$$typeof===z)return"<...>";try{var U=H(X);return U?"<"+U+">":"<...>"}catch(P){return"<...>"}}function m(){var X=N.A;return X===null?null:X.getOwner()}function S(){return Error("react-stack-top-frame")}function j(X){if(o.call(X,"key")){var U=Object.getOwnPropertyDescriptor(X,"key").get;if(U&&U.isReactWarning)return!1}return X.key!==void 0}function T(X,U){function P(){BW||(BW=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",U))}P.isReactWarning=!0,Object.defineProperty(X,"key",{get:P,configurable:!0})}function g(){var X=H(this.type);return GW[X]||(GW[X]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),X=this.props.ref,X!==void 0?X:null}function u(X,U,P,f,l,MW){var A=P.ref;return X={$$typeof:s,type:X,key:U,props:P,_owner:f},(A!==void 0?A:null)!==null?Object.defineProperty(X,"ref",{enumerable:!1,get:g}):Object.defineProperty(X,"ref",{enumerable:!1,value:null}),X._store={},Object.defineProperty(X._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(X,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(X,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l}),Object.defineProperty(X,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:MW}),Object.freeze&&(Object.freeze(X.props),Object.freeze(X)),X}function c(X,U,P,f,l,MW){var A=U.children;if(A!==void 0)if(f)if(a(A)){for(f=0;f<A.length;f++)p(A[f]);Object.freeze&&Object.freeze(A)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else p(A);if(o.call(U,"key")){A=H(X);var n=Object.keys(U).filter(function(DW){return DW!=="key"});f=0<n.length?"{key: someKey, "+n.join(": ..., ")+": ...}":"{key: someKey}",HW[A+f]||(n=0<n.length?"{"+n.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
14
+ let props = %s;
15
+ <%s {...props} />
16
+ React keys must be passed directly to JSX without using spread:
17
+ let props = %s;
18
+ <%s key={someKey} {...props} />`,f,A,n,A),HW[A+f]=!0)}if(A=null,P!==void 0&&(q(P),A=""+P),j(U)&&(q(U.key),A=""+U.key),"key"in U){P={};for(var t in U)t!=="key"&&(P[t]=U[t])}else P=U;return A&&T(P,typeof X==="function"?X.displayName||X.name||"Unknown":X),u(X,A,P,m(),l,MW)}function p(X){d(X)?X._store&&(X._store.validated=1):typeof X==="object"&&X!==null&&X.$$typeof===z&&(X._payload.status==="fulfilled"?d(X._payload.value)&&X._payload.value._store&&(X._payload.value._store.validated=1):X._store&&(X._store.validated=1))}function d(X){return typeof X==="object"&&X!==null&&X.$$typeof===s}var s=Symbol.for("react.transitional.element"),y=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),F=Symbol.for("react.strict_mode"),b=Symbol.for("react.profiler"),h=Symbol.for("react.consumer"),v=Symbol.for("react.context"),_=Symbol.for("react.forward_ref"),C=Symbol.for("react.suspense"),L=Symbol.for("react.suspense_list"),x=Symbol.for("react.memo"),z=Symbol.for("react.lazy"),Q=Symbol.for("react.activity"),M=Symbol.for("react.client.reference"),N=ZW.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,o=Object.prototype.hasOwnProperty,a=Array.isArray,WW=console.createTask?console.createTask:function(){return null};ZW={react_stack_bottom_frame:function(X){return X()}};var BW,GW={},QW=ZW.react_stack_bottom_frame.bind(ZW,S)(),OW=WW(R(S)),HW={};ZZ.Fragment=k,ZZ.jsxDEV=function(X,U,P,f){var l=1e4>N.recentlyCreatedOwnerStacks++;return c(X,U,P,f,l?Error("react-stack-top-frame"):QW,l?WW(R(X)):OW)}})()});var E=r(UW(),1),yW=r(XW(),1),hW=E.createContext(null),XZ=200;function BZ({children:H}){let[w,q]=E.useState(!1),[R,m]=E.useState([]),[S,j]=E.useState({}),[T,g]=E.useState({}),[u,c]=E.useState(0),[p,d]=E.useState(0),[s,y]=E.useState(0),k=E.useRef(null),F=E.useRef(null);E.useEffect(()=>{let v=setInterval(()=>{let _=Date.now();g((C)=>{let L={};for(let[x,z]of Object.entries(C))if(z.expiresAt>_)L[x]=z;return L})},500);return()=>clearInterval(v)},[]);let b=E.useCallback(()=>{if(k.current)k.current.close(),k.current=null;try{let v=new EventSource("/api/telemetry/stream");k.current=v,v.onopen=()=>{q(!0)},v.onmessage=(_)=>{if(!_.data||_.data.trim()==="")return;try{let C=JSON.parse(_.data);if(C.connected){q(!0);return}if(Array.isArray(C)){if(m((L)=>{return[...C,...L].slice(0,XZ)}),j((L)=>{let x={...L};for(let z of C){let Q=x[z.agent_id];if(!Q||new Date(z.timestamp)>new Date(Q.timestamp))x[z.agent_id]={timestamp:z.timestamp,category:z.category,type:z.type}}return x}),g((L)=>{let x={...L},z=Date.now()+3000;for(let Q of C)x[Q.agent_id]={type:Q.type,expiresAt:z};return x}),C.some((L)=>L.category==="system"&&(L.type==="agent_started"||L.type==="agent_stopped")))c((L)=>L+1);if(C.some((L)=>L.category==="TASK"&&(L.type==="task_created"||L.type==="task_updated"||L.type==="task_deleted")))d((L)=>L+1);if(C.some((L)=>L.level==="error"||L.category==="ERROR"||L.category==="system"&&L.type==="agent_stopped"))y((L)=>L+1)}}catch{}},v.onerror=()=>{if(q(!1),v.close(),k.current=null,F.current)clearTimeout(F.current);F.current=setTimeout(b,2000)}}catch{if(q(!1),F.current)clearTimeout(F.current);F.current=setTimeout(b,2000)}},[]);E.useEffect(()=>{return b(),()=>{if(k.current)k.current.close();if(F.current)clearTimeout(F.current)}},[b]);let h=E.useCallback(()=>{m([])},[]);return yW.jsxDEV(hW.Provider,{value:{connected:w,events:R,lastActivityByAgent:S,activeAgents:T,statusChangeCounter:u,taskChangeCounter:p,notificationCounter:s,clearEvents:h},children:H},void 0,!1,void 0,this)}function zW(){let H=E.useContext(hW);if(!H)throw Error("useTelemetryContext must be used within TelemetryProvider");return H}function GZ(H){let{connected:w,events:q,lastActivityByAgent:R}=zW(),m=E.default.useMemo(()=>{let T=q;if(H?.agent_id)T=T.filter((g)=>g.agent_id===H.agent_id);if(H?.category)T=T.filter((g)=>g.category===H.category);if(H?.limit)T=T.slice(0,H.limit);return T},[q,H?.agent_id,H?.category,H?.limit]),S=H?.agent_id?R[H.agent_id]:void 0,j=E.default.useMemo(()=>{if(!S)return!1;let T=new Date(S.timestamp).getTime();return Date.now()-T<1e4},[S]);return{connected:w,events:m,lastActivity:S,isActive:j}}function HZ(H){switch(H){case"llm_request":return"Thinking";case"tool_invocation":return"Using tools";case"tool_result":return"Using tools";case"thread_activity":return"Working";case"agent_started":return"Starting";case"agent_stopped":return"Stopped";default:return"Working"}}function MZ(H){let{activeAgents:w}=zW(),q=w[H];return{isActive:!!q,type:q?.type,label:q?HZ(q.type):void 0}}function YZ(){let{statusChangeCounter:H}=zW();return H}function zZ(){let{taskChangeCounter:H}=zW();return H}function QZ(){let{notificationCounter:H}=zW();return H}var V=r(UW(),1),sW=r(XW(),1),uW=V.createContext(null);function KW(){let H=V.useContext(uW);if(!H)throw Error("useAuth must be used within an AuthProvider");return H}function $Z({children:H}){let[w,q]=V.useState(null),[R,m]=V.useState(null),[S,j]=V.useState(!0),[T,g]=V.useState(null),[u,c]=V.useState(!1),[p,d]=V.useState(null),s=V.useRef(null),y=V.useRef(!1),k=V.useRef(!1),F=V.useCallback((z)=>{s.current=z,m(z)},[]),b=V.useCallback(async()=>{if(y.current)return!1;y.current=!0;try{let z=await fetch("/api/auth/refresh",{method:"POST",credentials:"include"});if(!z.ok)return!1;let Q=await z.json();if(F(Q.accessToken),Q.user)q(Q.user);if(Q.onboarding)d(Q.onboarding.completed||Q.onboarding.has_any_keys);return!!Q.user}catch(z){return console.error("Token refresh failed:",z),!1}finally{y.current=!1}},[F]),h=V.useCallback(async()=>{try{let z=s.current,M=await(await fetch("/api/auth/check",{headers:z?{Authorization:`Bearer ${z}`}:{}})).json();if(g(M.hasUsers),c(M.isDev??!1),M.onboarding)d(M.onboarding.completed||M.onboarding.has_any_keys);if(M.authenticated&&M.user)q(M.user);else if(q(null),M.hasUsers){if(!await b())F(null)}}catch(z){console.error("Auth check failed:",z),q(null),F(null)}finally{j(!1)}},[b,F]),v=V.useCallback(async(z,Q)=>{try{let M=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({username:z,password:Q})}),N=await M.json();if(!M.ok)return{success:!1,error:N.error||"Login failed"};return F(N.accessToken),q(N.user),g(!0),{success:!0}}catch(M){return console.error("Login failed:",M),{success:!1,error:"Login failed"}}},[F]),_=V.useCallback(async()=>{try{let z=s.current;await fetch("/api/auth/logout",{method:"POST",credentials:"include",headers:z?{Authorization:`Bearer ${z}`}:{}})}catch(z){console.error("Logout failed:",z)}finally{q(null),F(null)}},[F]),C=V.useCallback(async(z,Q={})=>{let M=new Headers(Q.headers),N=s.current;if(N)M.set("Authorization",`Bearer ${N}`);return fetch(z,{...Q,headers:M})},[]),L=V.useCallback(async()=>{return b()},[b]);V.useEffect(()=>{if(k.current)return;k.current=!0,h()},[h]),V.useEffect(()=>{if(!R)return;let z=setInterval(()=>{b()},840000);return()=>clearInterval(z)},[R,b]);let x={user:w,isAuthenticated:!!w,isLoading:S,hasUsers:T,isDev:u,accessToken:R,onboardingComplete:p,setOnboardingComplete:d,login:v,logout:_,refreshToken:L,checkAuth:h,authFetch:C};return sW.jsxDEV(uW.Provider,{value:x,children:H},void 0,!1,void 0,this)}function UZ(){let{accessToken:H}=KW();return H?{Authorization:`Bearer ${H}`}:{}}var I=r(UW(),1);var pW=r(XW(),1),dW=I.createContext(null);function OZ(){let H=I.useContext(dW);if(!H)throw Error("useProjects must be used within a ProjectProvider");return H}var NW="apteva_current_project";function DZ({children:H}){let{authFetch:w,isAuthenticated:q,isLoading:R}=KW(),[m,S]=I.useState([]),[j,T]=I.useState(()=>{if(typeof window<"u")return localStorage.getItem(NW);return null}),[g,u]=I.useState(!0),[c,p]=I.useState(null),[d,s]=I.useState(0),[y,k]=I.useState(!1),[F,b]=I.useState(!1);I.useEffect(()=>{fetch("/api/features").then((Q)=>Q.json()).then((Q)=>{k(Q.projects===!0),b(Q.metaAgent===!0)}).catch(()=>{k(!1),b(!1)})},[]);let h=I.useCallback((Q)=>{if(T(Q),typeof window<"u")if(Q===null)localStorage.removeItem(NW);else localStorage.setItem(NW,Q)},[]),v=m.find((Q)=>Q.id===j)||null,_=I.useCallback(async()=>{if(!y){S([]),u(!1);return}if(!q&&!R){S([]),u(!1);return}try{p(null);let Q=await w("/api/projects");if(!Q.ok)throw Error("Failed to fetch projects");let M=await Q.json();if(S(M.projects||[]),s(M.unassignedCount||0),j&&j!=="unassigned"&&!M.projects.find((N)=>N.id===j))h(null)}catch(Q){console.error("Failed to fetch projects:",Q),p("Failed to load projects")}finally{u(!1)}},[w,q,R,j,h,y]),C=I.useCallback(async(Q)=>{try{let M=await w("/api/projects",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Q)});if(!M.ok){let o=await M.json();throw Error(o.error||"Failed to create project")}let N=await M.json();return await _(),N.project}catch(M){return console.error("Failed to create project:",M),null}},[w,_]),L=I.useCallback(async(Q,M)=>{try{let N=await w(`/api/projects/${Q}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(M)});if(!N.ok){let a=await N.json();throw Error(a.error||"Failed to update project")}let o=await N.json();return await _(),o.project}catch(N){return console.error("Failed to update project:",N),null}},[w,_]),x=I.useCallback(async(Q)=>{try{let M=await w(`/api/projects/${Q}`,{method:"DELETE"});if(!M.ok){let N=await M.json();throw Error(N.error||"Failed to delete project")}if(j===Q)h(null);return await _(),!0}catch(M){return console.error("Failed to delete project:",M),!1}},[w,j,h,_]);I.useEffect(()=>{if(!R&&y)_()},[R,y,_]);let z={projects:m,currentProjectId:j,currentProject:v,isLoading:g,error:c,unassignedCount:d,projectsEnabled:y,metaAgentEnabled:F,setCurrentProjectId:h,createProject:C,updateProject:L,deleteProject:x,refreshProjects:_};return pW.jsxDEV(dW.Provider,{value:z,children:H},void 0,!1,void 0,this)}export{r as S,fW as T,JZ as U,UW as V,XW as W,BZ as X,zW as Y,GZ as Z,MZ as _,YZ as $,zZ as aa,QZ as ba,KW as ca,$Z as da,UZ as ea,OZ as fa,DZ as ga};
19
+
20
+ //# debugId=61F021475A28EB1464756E2164756E21