heyio 1.0.0 → 1.0.2

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.
@@ -31,6 +31,13 @@ export async function startApiServer(config) {
31
31
  app.use(express.static(webDistPath));
32
32
  // Auth middleware for all API routes
33
33
  const auth = createAuthMiddleware(config);
34
+ // Public endpoint — serves Supabase config to the frontend (no auth required)
35
+ app.get("/api/auth/config", (_req, res) => {
36
+ res.json({
37
+ supabaseUrl: config.supabaseUrl ?? null,
38
+ supabaseAnonKey: config.supabaseAnonKey ?? null,
39
+ });
40
+ });
34
41
  app.use("/api", auth);
35
42
  // --- SSE Stream ---
36
43
  app.get("/api/stream", (req, res) => {
@@ -149,9 +156,9 @@ export async function startApiServer(config) {
149
156
  const pages = await listPages();
150
157
  res.json(pages);
151
158
  });
152
- app.get("/api/wiki/page/*", async (req, res) => {
159
+ app.get("/api/wiki/page/*path", async (req, res) => {
153
160
  try {
154
- const pagePath = req.params[0];
161
+ const pagePath = req.params.path;
155
162
  const content = await readPage(pagePath);
156
163
  res.json({ path: pagePath, content });
157
164
  }
@@ -159,15 +166,15 @@ export async function startApiServer(config) {
159
166
  res.status(404).json({ error: err.message });
160
167
  }
161
168
  });
162
- app.put("/api/wiki/page/*", async (req, res) => {
163
- const pagePath = req.params[0];
169
+ app.put("/api/wiki/page/*path", async (req, res) => {
170
+ const pagePath = req.params.path;
164
171
  const { content } = req.body;
165
172
  await writePage(pagePath, content);
166
173
  res.json({ ok: true });
167
174
  });
168
- app.delete("/api/wiki/page/*", async (req, res) => {
175
+ app.delete("/api/wiki/page/*path", async (req, res) => {
169
176
  try {
170
- const pagePath = req.params[0];
177
+ const pagePath = req.params.path;
171
178
  await deletePage(pagePath);
172
179
  res.json({ ok: true });
173
180
  }
@@ -209,7 +216,7 @@ export async function startApiServer(config) {
209
216
  res.json({ status: "ok", version: process.env.npm_package_version ?? "unknown" });
210
217
  });
211
218
  // SPA fallback — serve index.html for non-API routes
212
- app.get("*", (_req, res) => {
219
+ app.get("*splat", (_req, res) => {
213
220
  res.sendFile(join(webDistPath, "index.html"));
214
221
  });
215
222
  app.listen(config.port, () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heyio",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "IO — a personal AI assistant daemon built on the GitHub Copilot SDK",
5
5
  "bin": {
6
6
  "io": "dist/index.js"
@@ -1,4 +1,4 @@
1
- import{e as v,j as h,r as u,i as b,o as k,l as i,d,c as a,u as c,b as g,F as w,m as _,z as S,x as M,a as x,n as C,k as y}from"./index-DZOS9syn.js";import{c as D}from"./api-WGvTsXaE.js";/**
1
+ import{e as v,j as h,r as u,i as b,o as k,l as i,d,c as a,u as c,b as g,F as w,m as _,z as S,x as M,a as x,n as C,k as y}from"./index-BxzKpjKp.js";import{c as D}from"./api-Bzs62QeP.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{e as $,i as I,o as F,l as a,d as r,c as o,F as b,m as g,h as f,u as _,I as M,r as d,k as m,t as l,D as y,b as k}from"./index-DZOS9syn.js";import{b as D,c as N,a as V}from"./api-WGvTsXaE.js";import{T as B}from"./trash-2-DHoetkC4.js";/**
1
+ import{e as $,i as I,o as F,l as a,d as r,c as o,F as b,m as g,h as f,u as _,I as M,r as d,k as m,t as l,D as y,b as k}from"./index-BxzKpjKp.js";import{b as D,c as N,a as V}from"./api-Bzs62QeP.js";import{T as B}from"./trash-2-C15lVsPO.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{i as b,q as v,l as d,d as u,c as e,D as y,z as m,x as p,t as c,b as w,u as f,r as l,v as h}from"./index-DZOS9syn.js";const k={class:"min-h-screen flex items-center justify-center bg-background p-4"},S={class:"w-full max-w-sm space-y-6"},_={key:0,class:"text-sm text-destructive"},V=["disabled"],D=b({__name:"LoginView",setup(q){const o=v(),g=h(),n=l(""),r=l(""),s=l("");async function x(){s.value="";try{await o.login(n.value,r.value),g.push("/")}catch(i){s.value=i.message??"Login failed"}}return(i,t)=>(d(),u("div",k,[e("div",S,[t[4]||(t[4]=e("div",{class:"text-center"},[e("div",{class:"text-4xl mb-2"},"🤖"),e("h1",{class:"text-2xl font-bold"},"IO"),e("p",{class:"text-sm text-muted-foreground mt-1"},"Sign in to your dashboard")],-1)),e("form",{onSubmit:y(x,["prevent"]),class:"space-y-4"},[e("div",null,[t[2]||(t[2]=e("label",{class:"text-sm font-medium",for:"email"},"Email",-1)),m(e("input",{id:"email","onUpdate:modelValue":t[0]||(t[0]=a=>n.value=a),type:"email",required:"",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"you@example.com"},null,512),[[p,n.value]])]),e("div",null,[t[3]||(t[3]=e("label",{class:"text-sm font-medium",for:"password"},"Password",-1)),m(e("input",{id:"password","onUpdate:modelValue":t[1]||(t[1]=a=>r.value=a),type:"password",required:"",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"••••••••"},null,512),[[p,r.value]])]),s.value?(d(),u("div",_,c(s.value),1)):w("",!0),e("button",{type:"submit",disabled:f(o).loading,class:"w-full rounded-md bg-primary text-primary-foreground px-4 py-2 text-sm font-medium hover:bg-primary/90 disabled:opacity-50 transition-colors"},c(f(o).loading?"Signing in...":"Sign In"),9,V)],32)])]))}});export{D as default};
1
+ import{i as b,q as v,l as d,d as u,c as e,D as y,z as m,x as p,t as c,b as w,u as f,r as l,v as h}from"./index-BxzKpjKp.js";const k={class:"min-h-screen flex items-center justify-center bg-background p-4"},S={class:"w-full max-w-sm space-y-6"},_={key:0,class:"text-sm text-destructive"},V=["disabled"],D=b({__name:"LoginView",setup(q){const o=v(),g=h(),n=l(""),r=l(""),s=l("");async function x(){s.value="";try{await o.login(n.value,r.value),g.push("/")}catch(i){s.value=i.message??"Login failed"}}return(i,t)=>(d(),u("div",k,[e("div",S,[t[4]||(t[4]=e("div",{class:"text-center"},[e("div",{class:"text-4xl mb-2"},"🤖"),e("h1",{class:"text-2xl font-bold"},"IO"),e("p",{class:"text-sm text-muted-foreground mt-1"},"Sign in to your dashboard")],-1)),e("form",{onSubmit:y(x,["prevent"]),class:"space-y-4"},[e("div",null,[t[2]||(t[2]=e("label",{class:"text-sm font-medium",for:"email"},"Email",-1)),m(e("input",{id:"email","onUpdate:modelValue":t[0]||(t[0]=a=>n.value=a),type:"email",required:"",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"you@example.com"},null,512),[[p,n.value]])]),e("div",null,[t[3]||(t[3]=e("label",{class:"text-sm font-medium",for:"password"},"Password",-1)),m(e("input",{id:"password","onUpdate:modelValue":t[1]||(t[1]=a=>r.value=a),type:"password",required:"",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"••••••••"},null,512),[[p,r.value]])]),s.value?(d(),u("div",_,c(s.value),1)):w("",!0),e("button",{type:"submit",disabled:f(o).loading,class:"w-full rounded-md bg-primary text-primary-foreground px-4 py-2 text-sm font-medium hover:bg-primary/90 disabled:opacity-50 transition-colors"},c(f(o).loading?"Signing in...":"Sign In"),9,V)],32)])]))}});export{D as default};
@@ -1 +1 @@
1
- import{i as k,o as C,l as a,d as n,c as t,h as m,u as p,g as h,z as u,x as c,w as S,b as _,S as V,F as M,m as N,r as i,t as b,k as y}from"./index-DZOS9syn.js";import{b as P,c as T,d as U,a as $}from"./api-WGvTsXaE.js";import{P as B}from"./plus-BOvyX1BC.js";import{T as D}from"./trash-2-DHoetkC4.js";const L={class:"p-6"},j={class:"flex items-center justify-between mb-6"},z={key:0,class:"border border-border rounded-lg p-4 mb-6 space-y-3"},A={class:"grid grid-cols-2 gap-3"},F={key:0},E={key:1},G={key:1,class:"text-muted-foreground"},R={key:2,class:"text-center py-12 text-muted-foreground"},q={key:3,class:"space-y-2"},H={class:"font-medium text-sm"},I={class:"ml-2 text-xs text-muted-foreground bg-secondary px-1.5 py-0.5 rounded"},J={class:"flex items-center gap-3"},K=["onClick"],O=["onClick"],ee=k({__name:"McpView",setup(Q){const d=i([]),v=i(!0),r=i(!1),o=i({name:"",type:"stdio",command:"",url:""});C(async()=>{try{d.value=await P("/mcp")}finally{v.value=!1}});async function f(l){await U(`/mcp/${l.id}`,{enabled:!l.enabled}),l.enabled=!l.enabled}async function x(l){await $(`/mcp/${l}`),d.value=d.value.filter(e=>e.id!==l)}async function g(){const l={name:o.value.name,type:o.value.type};o.value.type==="stdio"?l.command=o.value.command:l.url=o.value.url;const e=await T("/mcp",l);d.value.push(e),r.value=!1,o.value={name:"",type:"stdio",command:"",url:""}}return(l,e)=>(a(),n("div",L,[t("div",j,[e[6]||(e[6]=t("h1",{class:"text-2xl font-bold"},"MCP Servers",-1)),t("button",{onClick:e[0]||(e[0]=s=>r.value=!r.value),class:"inline-flex items-center gap-1 px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"},[m(p(B),{class:"w-4 h-4"}),e[5]||(e[5]=h(" Add Server ",-1))])]),r.value?(a(),n("div",z,[t("div",A,[t("div",null,[e[7]||(e[7]=t("label",{class:"text-sm font-medium"},"Name",-1)),u(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>o.value.name=s),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[c,o.value.name]])]),t("div",null,[e[9]||(e[9]=t("label",{class:"text-sm font-medium"},"Type",-1)),u(t("select",{"onUpdate:modelValue":e[2]||(e[2]=s=>o.value.type=s),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[8]||(e[8]=[t("option",{value:"stdio"},"stdio",-1),t("option",{value:"http"},"http",-1)])],512),[[S,o.value.type]])])]),o.value.type==="stdio"?(a(),n("div",F,[e[10]||(e[10]=t("label",{class:"text-sm font-medium"},"Command",-1)),u(t("input",{"onUpdate:modelValue":e[3]||(e[3]=s=>o.value.command=s),placeholder:"npx @my/mcp-server",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[c,o.value.command]])])):(a(),n("div",E,[e[11]||(e[11]=t("label",{class:"text-sm font-medium"},"URL",-1)),u(t("input",{"onUpdate:modelValue":e[4]||(e[4]=s=>o.value.url=s),placeholder:"https://...",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[c,o.value.url]])])),t("button",{onClick:g,class:"px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90"},"Save")])):_("",!0),v.value?(a(),n("div",G,"Loading...")):d.value.length===0?(a(),n("div",R,[m(p(V),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[12]||(e[12]=t("p",null,"No MCP servers configured.",-1))])):(a(),n("div",q,[(a(!0),n(M,null,N(d.value,s=>(a(),n("div",{key:s.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3"},[t("div",null,[t("span",H,b(s.name),1),t("span",I,b(s.type),1)]),t("div",J,[t("button",{onClick:w=>f(s),class:y(["relative w-10 h-5 rounded-full transition-colors",s.enabled?"bg-primary":"bg-muted"])},[t("span",{class:y(["absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform",s.enabled?"translate-x-5":"translate-x-0.5"])},null,2)],10,K),t("button",{onClick:w=>x(s.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[m(p(D),{class:"w-4 h-4"})],8,O)])]))),128))]))]))}});export{ee as default};
1
+ import{i as k,o as C,l as a,d as n,c as t,h as m,u as p,g as h,z as u,x as c,w as S,b as _,S as V,F as M,m as N,r as i,t as b,k as y}from"./index-BxzKpjKp.js";import{b as P,c as T,d as U,a as $}from"./api-Bzs62QeP.js";import{P as B}from"./plus-C7dsO8j7.js";import{T as D}from"./trash-2-C15lVsPO.js";const L={class:"p-6"},j={class:"flex items-center justify-between mb-6"},z={key:0,class:"border border-border rounded-lg p-4 mb-6 space-y-3"},A={class:"grid grid-cols-2 gap-3"},F={key:0},E={key:1},G={key:1,class:"text-muted-foreground"},R={key:2,class:"text-center py-12 text-muted-foreground"},q={key:3,class:"space-y-2"},H={class:"font-medium text-sm"},I={class:"ml-2 text-xs text-muted-foreground bg-secondary px-1.5 py-0.5 rounded"},J={class:"flex items-center gap-3"},K=["onClick"],O=["onClick"],ee=k({__name:"McpView",setup(Q){const d=i([]),v=i(!0),r=i(!1),o=i({name:"",type:"stdio",command:"",url:""});C(async()=>{try{d.value=await P("/mcp")}finally{v.value=!1}});async function f(l){await U(`/mcp/${l.id}`,{enabled:!l.enabled}),l.enabled=!l.enabled}async function x(l){await $(`/mcp/${l}`),d.value=d.value.filter(e=>e.id!==l)}async function g(){const l={name:o.value.name,type:o.value.type};o.value.type==="stdio"?l.command=o.value.command:l.url=o.value.url;const e=await T("/mcp",l);d.value.push(e),r.value=!1,o.value={name:"",type:"stdio",command:"",url:""}}return(l,e)=>(a(),n("div",L,[t("div",j,[e[6]||(e[6]=t("h1",{class:"text-2xl font-bold"},"MCP Servers",-1)),t("button",{onClick:e[0]||(e[0]=s=>r.value=!r.value),class:"inline-flex items-center gap-1 px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"},[m(p(B),{class:"w-4 h-4"}),e[5]||(e[5]=h(" Add Server ",-1))])]),r.value?(a(),n("div",z,[t("div",A,[t("div",null,[e[7]||(e[7]=t("label",{class:"text-sm font-medium"},"Name",-1)),u(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>o.value.name=s),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[c,o.value.name]])]),t("div",null,[e[9]||(e[9]=t("label",{class:"text-sm font-medium"},"Type",-1)),u(t("select",{"onUpdate:modelValue":e[2]||(e[2]=s=>o.value.type=s),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[8]||(e[8]=[t("option",{value:"stdio"},"stdio",-1),t("option",{value:"http"},"http",-1)])],512),[[S,o.value.type]])])]),o.value.type==="stdio"?(a(),n("div",F,[e[10]||(e[10]=t("label",{class:"text-sm font-medium"},"Command",-1)),u(t("input",{"onUpdate:modelValue":e[3]||(e[3]=s=>o.value.command=s),placeholder:"npx @my/mcp-server",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[c,o.value.command]])])):(a(),n("div",E,[e[11]||(e[11]=t("label",{class:"text-sm font-medium"},"URL",-1)),u(t("input",{"onUpdate:modelValue":e[4]||(e[4]=s=>o.value.url=s),placeholder:"https://...",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[c,o.value.url]])])),t("button",{onClick:g,class:"px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90"},"Save")])):_("",!0),v.value?(a(),n("div",G,"Loading...")):d.value.length===0?(a(),n("div",R,[m(p(V),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[12]||(e[12]=t("p",null,"No MCP servers configured.",-1))])):(a(),n("div",q,[(a(!0),n(M,null,N(d.value,s=>(a(),n("div",{key:s.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3"},[t("div",null,[t("span",H,b(s.name),1),t("span",I,b(s.type),1)]),t("div",J,[t("button",{onClick:w=>f(s),class:y(["relative w-10 h-5 rounded-full transition-colors",s.enabled?"bg-primary":"bg-muted"])},[t("span",{class:y(["absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform",s.enabled?"translate-x-5":"translate-x-0.5"])},null,2)],10,K),t("button",{onClick:w=>x(s.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[m(p(D),{class:"w-4 h-4"})],8,O)])]))),128))]))]))}});export{ee as default};
@@ -1 +1 @@
1
- import{i as q,o as V,l as d,d as r,c as t,h as c,u as v,g as $,F as y,m as k,z as p,w,x as h,b as P,C as T,t as m,r as n,k as b}from"./index-DZOS9syn.js";import{b as N,c as z,d as A,a as U}from"./api-WGvTsXaE.js";import{P as B}from"./plus-BOvyX1BC.js";import{T as D}from"./trash-2-DHoetkC4.js";const I={class:"p-6"},M={class:"flex items-center justify-between mb-6"},j={class:"flex gap-1 border-b border-border mb-4"},E=["onClick"],F={key:0,class:"border border-border rounded-lg p-4 mb-4 space-y-3"},L={class:"grid grid-cols-2 gap-3"},O={key:0},G={key:1},H={key:1,class:"text-muted-foreground"},J={key:2,class:"text-center py-12 text-muted-foreground"},K={key:3,class:"space-y-2"},Q={class:"text-sm font-medium font-mono"},R={class:"text-xs text-muted-foreground mt-0.5"},W={class:"flex items-center gap-3"},X=["onClick"],Y=["onClick"],ae=q({__name:"SchedulesView",setup(Z){const l=n([]),g=n(!0),u=n("squad"),i=n(!1),s=n({type:"squad",cron:"",squad_id:"",agenda:"triage",prompt:""});V(async()=>{try{l.value=await N("/schedules")}finally{g.value=!1}});const f=()=>l.value.filter(a=>a.type===u.value);async function _(){const a={type:s.value.type,cron:s.value.cron};s.value.type==="squad"?(a.squad_id=s.value.squad_id,a.agenda=s.value.agenda):a.prompt=s.value.prompt;const e=await z("/schedules",a);l.value.push(e),i.value=!1}async function S(a){const e=!a.enabled;await A(`/schedules/${a.id}`,{enabled:e}),a.enabled=e?1:0}async function C(a){await U(`/schedules/${a}`),l.value=l.value.filter(e=>e.id!==a)}return(a,e)=>(d(),r("div",I,[t("div",M,[e[6]||(e[6]=t("h1",{class:"text-2xl font-bold"},"Schedules",-1)),t("button",{onClick:e[0]||(e[0]=o=>i.value=!i.value),class:"inline-flex items-center gap-1 px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"},[c(v(B),{class:"w-4 h-4"}),e[5]||(e[5]=$(" Add Schedule ",-1))])]),t("div",j,[(d(),r(y,null,k(["squad","io"],o=>t("button",{key:o,onClick:x=>u.value=o,class:b(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",u.value===o?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},m(o==="squad"?"Squad Schedules":"IO Schedules"),11,E)),64))]),i.value?(d(),r("div",F,[t("div",L,[t("div",null,[e[8]||(e[8]=t("label",{class:"text-sm font-medium"},"Type",-1)),p(t("select",{"onUpdate:modelValue":e[1]||(e[1]=o=>s.value.type=o),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[7]||(e[7]=[t("option",{value:"squad"},"Squad",-1),t("option",{value:"io"},"IO",-1)])],512),[[w,s.value.type]])]),t("div",null,[e[9]||(e[9]=t("label",{class:"text-sm font-medium"},"Cron Expression",-1)),p(t("input",{"onUpdate:modelValue":e[2]||(e[2]=o=>s.value.cron=o),placeholder:"0 9 * * 1-5",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[h,s.value.cron]])])]),s.value.type==="squad"?(d(),r("div",O,[e[11]||(e[11]=t("label",{class:"text-sm font-medium"},"Agenda",-1)),p(t("select",{"onUpdate:modelValue":e[3]||(e[3]=o=>s.value.agenda=o),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[10]||(e[10]=[t("option",{value:"triage"},"Triage",-1),t("option",{value:"prioritize"},"Prioritize",-1),t("option",{value:"ideation"},"Ideation",-1)])],512),[[w,s.value.agenda]])])):(d(),r("div",G,[e[12]||(e[12]=t("label",{class:"text-sm font-medium"},"Prompt",-1)),p(t("textarea",{"onUpdate:modelValue":e[4]||(e[4]=o=>s.value.prompt=o),rows:"2",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[h,s.value.prompt]])])),t("button",{onClick:_,class:"px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90"},"Save")])):P("",!0),g.value?(d(),r("div",H,"Loading...")):f().length===0?(d(),r("div",J,[c(v(T),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),t("p",null,"No "+m(u.value)+" schedules configured.",1)])):(d(),r("div",K,[(d(!0),r(y,null,k(f(),o=>(d(),r("div",{key:o.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3"},[t("div",null,[t("div",Q,m(o.cron),1),t("div",R,m(o.type==="squad"?`Agenda: ${o.agenda}`:o.prompt.slice(0,60)),1)]),t("div",W,[t("button",{onClick:x=>S(o),class:b(["relative w-10 h-5 rounded-full transition-colors",o.enabled?"bg-primary":"bg-muted"])},[t("span",{class:b(["absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform",o.enabled?"translate-x-5":"translate-x-0.5"])},null,2)],10,X),t("button",{onClick:x=>C(o.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[c(v(D),{class:"w-4 h-4"})],8,Y)])]))),128))]))]))}});export{ae as default};
1
+ import{i as q,o as V,l as d,d as r,c as t,h as c,u as v,g as $,F as y,m as k,z as p,w,x as h,b as P,C as T,t as m,r as n,k as b}from"./index-BxzKpjKp.js";import{b as N,c as z,d as A,a as U}from"./api-Bzs62QeP.js";import{P as B}from"./plus-C7dsO8j7.js";import{T as D}from"./trash-2-C15lVsPO.js";const I={class:"p-6"},M={class:"flex items-center justify-between mb-6"},j={class:"flex gap-1 border-b border-border mb-4"},E=["onClick"],F={key:0,class:"border border-border rounded-lg p-4 mb-4 space-y-3"},L={class:"grid grid-cols-2 gap-3"},O={key:0},G={key:1},H={key:1,class:"text-muted-foreground"},J={key:2,class:"text-center py-12 text-muted-foreground"},K={key:3,class:"space-y-2"},Q={class:"text-sm font-medium font-mono"},R={class:"text-xs text-muted-foreground mt-0.5"},W={class:"flex items-center gap-3"},X=["onClick"],Y=["onClick"],ae=q({__name:"SchedulesView",setup(Z){const l=n([]),g=n(!0),u=n("squad"),i=n(!1),s=n({type:"squad",cron:"",squad_id:"",agenda:"triage",prompt:""});V(async()=>{try{l.value=await N("/schedules")}finally{g.value=!1}});const f=()=>l.value.filter(a=>a.type===u.value);async function _(){const a={type:s.value.type,cron:s.value.cron};s.value.type==="squad"?(a.squad_id=s.value.squad_id,a.agenda=s.value.agenda):a.prompt=s.value.prompt;const e=await z("/schedules",a);l.value.push(e),i.value=!1}async function S(a){const e=!a.enabled;await A(`/schedules/${a.id}`,{enabled:e}),a.enabled=e?1:0}async function C(a){await U(`/schedules/${a}`),l.value=l.value.filter(e=>e.id!==a)}return(a,e)=>(d(),r("div",I,[t("div",M,[e[6]||(e[6]=t("h1",{class:"text-2xl font-bold"},"Schedules",-1)),t("button",{onClick:e[0]||(e[0]=o=>i.value=!i.value),class:"inline-flex items-center gap-1 px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"},[c(v(B),{class:"w-4 h-4"}),e[5]||(e[5]=$(" Add Schedule ",-1))])]),t("div",j,[(d(),r(y,null,k(["squad","io"],o=>t("button",{key:o,onClick:x=>u.value=o,class:b(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",u.value===o?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},m(o==="squad"?"Squad Schedules":"IO Schedules"),11,E)),64))]),i.value?(d(),r("div",F,[t("div",L,[t("div",null,[e[8]||(e[8]=t("label",{class:"text-sm font-medium"},"Type",-1)),p(t("select",{"onUpdate:modelValue":e[1]||(e[1]=o=>s.value.type=o),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[7]||(e[7]=[t("option",{value:"squad"},"Squad",-1),t("option",{value:"io"},"IO",-1)])],512),[[w,s.value.type]])]),t("div",null,[e[9]||(e[9]=t("label",{class:"text-sm font-medium"},"Cron Expression",-1)),p(t("input",{"onUpdate:modelValue":e[2]||(e[2]=o=>s.value.cron=o),placeholder:"0 9 * * 1-5",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[h,s.value.cron]])])]),s.value.type==="squad"?(d(),r("div",O,[e[11]||(e[11]=t("label",{class:"text-sm font-medium"},"Agenda",-1)),p(t("select",{"onUpdate:modelValue":e[3]||(e[3]=o=>s.value.agenda=o),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[10]||(e[10]=[t("option",{value:"triage"},"Triage",-1),t("option",{value:"prioritize"},"Prioritize",-1),t("option",{value:"ideation"},"Ideation",-1)])],512),[[w,s.value.agenda]])])):(d(),r("div",G,[e[12]||(e[12]=t("label",{class:"text-sm font-medium"},"Prompt",-1)),p(t("textarea",{"onUpdate:modelValue":e[4]||(e[4]=o=>s.value.prompt=o),rows:"2",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[h,s.value.prompt]])])),t("button",{onClick:_,class:"px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90"},"Save")])):P("",!0),g.value?(d(),r("div",H,"Loading...")):f().length===0?(d(),r("div",J,[c(v(T),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),t("p",null,"No "+m(u.value)+" schedules configured.",1)])):(d(),r("div",K,[(d(!0),r(y,null,k(f(),o=>(d(),r("div",{key:o.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3"},[t("div",null,[t("div",Q,m(o.cron),1),t("div",R,m(o.type==="squad"?`Agenda: ${o.agenda}`:o.prompt.slice(0,60)),1)]),t("div",W,[t("button",{onClick:x=>S(o),class:b(["relative w-10 h-5 rounded-full transition-colors",o.enabled?"bg-primary":"bg-muted"])},[t("span",{class:b(["absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform",o.enabled?"translate-x-5":"translate-x-0.5"])},null,2)],10,X),t("button",{onClick:x=>C(o.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[c(v(D),{class:"w-4 h-4"})],8,Y)])]))),128))]))]))}});export{ae as default};
@@ -1 +1 @@
1
- import{i as n,l,d as s,c as r,F as i,m,f as d,b as a,r as b,k as p,t as c}from"./index-DZOS9syn.js";const x={class:"p-6"},f={class:"flex gap-1 border-b border-border mb-6"},g=["onClick"],v={key:0,class:"space-y-4 max-w-lg"},y={key:1,class:"space-y-4 max-w-lg"},w={key:2,class:"space-y-4 max-w-lg"},k={key:3,class:"space-y-4 max-w-lg"},h={key:4,class:"space-y-4 max-w-lg"},T=n({__name:"SettingsView",setup(_){const t=b("general"),u=[{id:"general",label:"General"},{id:"telegram",label:"Telegram"},{id:"auth",label:"Auth"},{id:"models",label:"Models"},{id:"advanced",label:"Advanced"}];return(S,e)=>(l(),s("div",x,[e[5]||(e[5]=r("h1",{class:"text-2xl font-bold mb-6"},"Settings",-1)),r("div",f,[(l(),s(i,null,m(u,o=>r("button",{key:o.id,onClick:A=>t.value=o.id,class:p(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",t.value===o.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},c(o.label),11,g)),64))]),t.value==="general"?(l(),s("div",v,[...e[0]||(e[0]=[d('<div><label class="text-sm font-medium">Default Model</label><input value="gpt-4.1" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Port</label><input type="number" value="3170" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Background Notify Mode</label><select class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"><option value="all">All</option><option value="meaningful" selected>Meaningful</option><option value="off">Off</option></select></div>',3)])])):a("",!0),t.value==="telegram"?(l(),s("div",y,[...e[1]||(e[1]=[d('<div><label class="text-sm font-medium">Bot Token</label><input type="password" placeholder="••••••••" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Authorized User ID</label><input type="number" placeholder="123456789" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div class="flex items-center gap-3"><label class="text-sm font-medium">Enable Telegram</label><button class="relative w-10 h-5 rounded-full bg-muted"><span class="absolute top-0.5 left-0.5 w-4 h-4 rounded-full bg-white"></span></button></div>',3)])])):a("",!0),t.value==="auth"?(l(),s("div",w,[...e[2]||(e[2]=[d('<div><label class="text-sm font-medium">Supabase URL</label><input placeholder="https://your-project.supabase.co" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Supabase Anon Key</label><input type="password" placeholder="••••••••" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Authorized Email</label><input type="email" placeholder="you@example.com" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div>',3)])])):a("",!0),t.value==="models"?(l(),s("div",k,[...e[3]||(e[3]=[d('<div><label class="text-sm font-medium">High Tier</label><p class="text-xs text-muted-foreground mb-1">Complex tasks (architecture, debugging)</p><input value="claude-opus-4.7, claude-opus-4.6" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Medium Tier</label><p class="text-xs text-muted-foreground mb-1">Standard tasks (features, tests)</p><input value="claude-sonnet-4.6, gpt-5.5, claude-opus-4.5" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Low Tier</label><p class="text-xs text-muted-foreground mb-1">Simple tasks (reads, formatting)</p><input value="claude-haiku-4.5, gpt-5.4-mini" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div>',3)])])):a("",!0),t.value==="advanced"?(l(),s("div",h,[...e[4]||(e[4]=[d('<div class="flex items-center justify-between"><div><label class="text-sm font-medium">Self-Edit Mode</label><p class="text-xs text-muted-foreground">Allow IO to modify its own source code</p></div><button class="relative w-10 h-5 rounded-full bg-muted"><span class="absolute top-0.5 left-0.5 w-4 h-4 rounded-full bg-white"></span></button></div><div class="flex items-center justify-between"><div><label class="text-sm font-medium">Watchdog</label><p class="text-xs text-muted-foreground">Monitor event loop and zombie instances</p></div><button class="relative w-10 h-5 rounded-full bg-primary"><span class="absolute top-0.5 w-4 h-4 rounded-full bg-white translate-x-5"></span></button></div>',2)])])):a("",!0)]))}});export{T as default};
1
+ import{i as n,l,d as s,c as r,F as i,m,f as d,b as a,r as b,k as p,t as c}from"./index-BxzKpjKp.js";const x={class:"p-6"},f={class:"flex gap-1 border-b border-border mb-6"},g=["onClick"],v={key:0,class:"space-y-4 max-w-lg"},y={key:1,class:"space-y-4 max-w-lg"},w={key:2,class:"space-y-4 max-w-lg"},k={key:3,class:"space-y-4 max-w-lg"},h={key:4,class:"space-y-4 max-w-lg"},T=n({__name:"SettingsView",setup(_){const t=b("general"),u=[{id:"general",label:"General"},{id:"telegram",label:"Telegram"},{id:"auth",label:"Auth"},{id:"models",label:"Models"},{id:"advanced",label:"Advanced"}];return(S,e)=>(l(),s("div",x,[e[5]||(e[5]=r("h1",{class:"text-2xl font-bold mb-6"},"Settings",-1)),r("div",f,[(l(),s(i,null,m(u,o=>r("button",{key:o.id,onClick:A=>t.value=o.id,class:p(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",t.value===o.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},c(o.label),11,g)),64))]),t.value==="general"?(l(),s("div",v,[...e[0]||(e[0]=[d('<div><label class="text-sm font-medium">Default Model</label><input value="gpt-4.1" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Port</label><input type="number" value="3170" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Background Notify Mode</label><select class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"><option value="all">All</option><option value="meaningful" selected>Meaningful</option><option value="off">Off</option></select></div>',3)])])):a("",!0),t.value==="telegram"?(l(),s("div",y,[...e[1]||(e[1]=[d('<div><label class="text-sm font-medium">Bot Token</label><input type="password" placeholder="••••••••" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Authorized User ID</label><input type="number" placeholder="123456789" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div class="flex items-center gap-3"><label class="text-sm font-medium">Enable Telegram</label><button class="relative w-10 h-5 rounded-full bg-muted"><span class="absolute top-0.5 left-0.5 w-4 h-4 rounded-full bg-white"></span></button></div>',3)])])):a("",!0),t.value==="auth"?(l(),s("div",w,[...e[2]||(e[2]=[d('<div><label class="text-sm font-medium">Supabase URL</label><input placeholder="https://your-project.supabase.co" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Supabase Anon Key</label><input type="password" placeholder="••••••••" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Authorized Email</label><input type="email" placeholder="you@example.com" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div>',3)])])):a("",!0),t.value==="models"?(l(),s("div",k,[...e[3]||(e[3]=[d('<div><label class="text-sm font-medium">High Tier</label><p class="text-xs text-muted-foreground mb-1">Complex tasks (architecture, debugging)</p><input value="claude-opus-4.7, claude-opus-4.6" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Medium Tier</label><p class="text-xs text-muted-foreground mb-1">Standard tasks (features, tests)</p><input value="claude-sonnet-4.6, gpt-5.5, claude-opus-4.5" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div><div><label class="text-sm font-medium">Low Tier</label><p class="text-xs text-muted-foreground mb-1">Simple tasks (reads, formatting)</p><input value="claude-haiku-4.5, gpt-5.4-mini" class="mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"></div>',3)])])):a("",!0),t.value==="advanced"?(l(),s("div",h,[...e[4]||(e[4]=[d('<div class="flex items-center justify-between"><div><label class="text-sm font-medium">Self-Edit Mode</label><p class="text-xs text-muted-foreground">Allow IO to modify its own source code</p></div><button class="relative w-10 h-5 rounded-full bg-muted"><span class="absolute top-0.5 left-0.5 w-4 h-4 rounded-full bg-white"></span></button></div><div class="flex items-center justify-between"><div><label class="text-sm font-medium">Watchdog</label><p class="text-xs text-muted-foreground">Monitor event loop and zombie instances</p></div><button class="relative w-10 h-5 rounded-full bg-primary"><span class="absolute top-0.5 w-4 h-4 rounded-full bg-white translate-x-5"></span></button></div>',2)])])):a("",!0)]))}});export{T as default};
@@ -1 +1 @@
1
- import{i as k,o as h,l,d as o,c as t,h as g,u as f,g as _,z as w,x as S,A as C,t as n,b as x,P as V,F,m as N,r}from"./index-DZOS9syn.js";import{b as P,c as A,a as T}from"./api-WGvTsXaE.js";import{P as z}from"./plus-BOvyX1BC.js";import{T as B}from"./trash-2-DHoetkC4.js";const D={class:"p-6"},L={class:"flex items-center justify-between mb-6"},R={key:0,class:"mb-6 p-4 border border-border rounded-lg"},U={class:"flex gap-2"},$=["disabled"],j={key:0,class:"text-sm text-destructive mt-2"},G={key:1,class:"text-muted-foreground"},I={key:2,class:"text-center py-12 text-muted-foreground"},K={key:3,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},M={class:"flex items-start justify-between"},E={class:"font-semibold"},q=["onClick"],H={class:"text-sm text-muted-foreground mt-1"},J={class:"text-xs text-muted-foreground mt-2 font-mono"},ee=k({__name:"SkillsView",setup(O){const c=r([]),p=r(!0),d=r(!1),a=r(""),u=r(!1),i=r("");async function v(){p.value=!0;try{c.value=await P("/skills")}finally{p.value=!1}}async function y(){if(a.value.trim()){u.value=!0,i.value="";try{await A("/skills",{url:a.value.trim()}),a.value="",d.value=!1,await v()}catch(m){i.value=m.message||"Failed to install skill"}finally{u.value=!1}}}async function b(m){try{await T(`/skills/${m}`),await v()}catch(e){i.value=e.message||"Failed to remove skill"}}return h(v),(m,e)=>(l(),o("div",D,[t("div",L,[e[3]||(e[3]=t("h1",{class:"text-2xl font-bold"},"Skills",-1)),t("button",{onClick:e[0]||(e[0]=s=>d.value=!d.value),class:"inline-flex items-center gap-2 px-3 py-2 rounded-md bg-primary text-primary-foreground text-sm hover:bg-primary/90"},[g(f(z),{class:"w-4 h-4"}),e[2]||(e[2]=_(" Add Skill ",-1))])]),d.value?(l(),o("div",R,[e[4]||(e[4]=t("label",{class:"block text-sm font-medium mb-2"},"Git Repository URL",-1)),t("div",U,[w(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>a.value=s),type:"text",placeholder:"https://github.com/user/skill-repo.git",class:"flex-1 px-3 py-2 rounded-md border border-input bg-background text-sm",onKeyup:C(y,["enter"])},null,544),[[S,a.value]]),t("button",{onClick:y,disabled:u.value||!a.value.trim(),class:"px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm hover:bg-primary/90 disabled:opacity-50"},n(u.value?"Installing...":"Install"),9,$)]),i.value?(l(),o("p",j,n(i.value),1)):x("",!0)])):x("",!0),p.value?(l(),o("div",G,"Loading...")):c.value.length===0?(l(),o("div",I,[g(f(V),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[5]||(e[5]=t("p",null,"No skills installed.",-1)),e[6]||(e[6]=t("p",{class:"text-sm mt-1"},'Click "Add Skill" to install from a git repository.',-1))])):(l(),o("div",K,[(l(!0),o(F,null,N(c.value,s=>(l(),o("div",{key:s.slug,class:"border border-border rounded-lg p-4 group"},[t("div",M,[t("h3",E,n(s.name),1),t("button",{onClick:Q=>b(s.slug),class:"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-destructive/10 text-destructive transition-opacity",title:"Remove skill"},[g(f(B),{class:"w-4 h-4"})],8,q)]),t("p",H,n(s.description),1),t("div",J,n(s.slug),1)]))),128))]))]))}});export{ee as default};
1
+ import{i as k,o as h,l,d as o,c as t,h as g,u as f,g as _,z as w,x as S,A as C,t as n,b as x,P as V,F,m as N,r}from"./index-BxzKpjKp.js";import{b as P,c as A,a as T}from"./api-Bzs62QeP.js";import{P as z}from"./plus-C7dsO8j7.js";import{T as B}from"./trash-2-C15lVsPO.js";const D={class:"p-6"},L={class:"flex items-center justify-between mb-6"},R={key:0,class:"mb-6 p-4 border border-border rounded-lg"},U={class:"flex gap-2"},$=["disabled"],j={key:0,class:"text-sm text-destructive mt-2"},G={key:1,class:"text-muted-foreground"},I={key:2,class:"text-center py-12 text-muted-foreground"},K={key:3,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},M={class:"flex items-start justify-between"},E={class:"font-semibold"},q=["onClick"],H={class:"text-sm text-muted-foreground mt-1"},J={class:"text-xs text-muted-foreground mt-2 font-mono"},ee=k({__name:"SkillsView",setup(O){const c=r([]),p=r(!0),d=r(!1),a=r(""),u=r(!1),i=r("");async function v(){p.value=!0;try{c.value=await P("/skills")}finally{p.value=!1}}async function y(){if(a.value.trim()){u.value=!0,i.value="";try{await A("/skills",{url:a.value.trim()}),a.value="",d.value=!1,await v()}catch(m){i.value=m.message||"Failed to install skill"}finally{u.value=!1}}}async function b(m){try{await T(`/skills/${m}`),await v()}catch(e){i.value=e.message||"Failed to remove skill"}}return h(v),(m,e)=>(l(),o("div",D,[t("div",L,[e[3]||(e[3]=t("h1",{class:"text-2xl font-bold"},"Skills",-1)),t("button",{onClick:e[0]||(e[0]=s=>d.value=!d.value),class:"inline-flex items-center gap-2 px-3 py-2 rounded-md bg-primary text-primary-foreground text-sm hover:bg-primary/90"},[g(f(z),{class:"w-4 h-4"}),e[2]||(e[2]=_(" Add Skill ",-1))])]),d.value?(l(),o("div",R,[e[4]||(e[4]=t("label",{class:"block text-sm font-medium mb-2"},"Git Repository URL",-1)),t("div",U,[w(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>a.value=s),type:"text",placeholder:"https://github.com/user/skill-repo.git",class:"flex-1 px-3 py-2 rounded-md border border-input bg-background text-sm",onKeyup:C(y,["enter"])},null,544),[[S,a.value]]),t("button",{onClick:y,disabled:u.value||!a.value.trim(),class:"px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm hover:bg-primary/90 disabled:opacity-50"},n(u.value?"Installing...":"Install"),9,$)]),i.value?(l(),o("p",j,n(i.value),1)):x("",!0)])):x("",!0),p.value?(l(),o("div",G,"Loading...")):c.value.length===0?(l(),o("div",I,[g(f(V),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[5]||(e[5]=t("p",null,"No skills installed.",-1)),e[6]||(e[6]=t("p",{class:"text-sm mt-1"},'Click "Add Skill" to install from a git repository.',-1))])):(l(),o("div",K,[(l(!0),o(F,null,N(c.value,s=>(l(),o("div",{key:s.slug,class:"border border-border rounded-lg p-4 group"},[t("div",M,[t("h3",E,n(s.name),1),t("button",{onClick:Q=>b(s.slug),class:"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-destructive/10 text-destructive transition-opacity",title:"Remove skill"},[g(f(B),{class:"w-4 h-4"})],8,q)]),t("p",H,n(s.description),1),t("div",J,n(s.slug),1)]))),128))]))]))}});export{ee as default};
@@ -1,4 +1,4 @@
1
- import{e as m,i as w,o as C,l as o,d as l,h as d,y as q,F as c,c as e,t as a,m as b,b as r,s as A,r as i,p as L,k as g,u as p,g as x}from"./index-DZOS9syn.js";import{b as M}from"./api-WGvTsXaE.js";/**
1
+ import{e as m,i as w,o as C,l as o,d as l,h as d,y as q,F as c,c as e,t as a,m as b,b as r,s as A,r as i,p as L,k as g,u as p,g as x}from"./index-BxzKpjKp.js";import{b as M}from"./api-Bzs62QeP.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{b as _}from"./api-WGvTsXaE.js";import{e as y,i as x,o as f,l as o,d as r,c as e,h as u,u as m,U as h,F as v,m as k,r as d,a as b,y as q,p as w,t as n,g as B,b as N}from"./index-DZOS9syn.js";/**
1
+ import{b as _}from"./api-Bzs62QeP.js";import{e as y,i as x,o as f,l as o,d as r,c as e,h as u,u as m,U as h,F as v,m as k,r as d,a as b,y as q,p as w,t as n,g as B,b as N}from"./index-BxzKpjKp.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{e as h,i as S,o as V,l as o,d as s,c as e,h as c,u as i,z as k,x as b,b as z,F as m,m as L,B as $,t as x,r,k as B}from"./index-DZOS9syn.js";import{b as y,d as D,a as I}from"./api-WGvTsXaE.js";import{T as j}from"./trash-2-DHoetkC4.js";/**
1
+ import{e as h,i as S,o as V,l as o,d as s,c as e,h as c,u as i,z as k,x as b,b as z,F as m,m as L,B as $,t as x,r,k as B}from"./index-BxzKpjKp.js";import{b as y,d as D,a as I}from"./api-Bzs62QeP.js";import{T as j}from"./trash-2-C15lVsPO.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{q as n}from"./index-DZOS9syn.js";const o="/api";async function a(){const r=n(),t={"Content-Type":"application/json"};return r.token&&(t.Authorization=`Bearer ${r.token}`),t}async function i(r){const t=await fetch(`${o}${r}`,{headers:await a()});if(!t.ok)throw new Error(`API error: ${t.status}`);return t.json()}async function c(r,t){const e=await fetch(`${o}${r}`,{method:"POST",headers:await a(),body:t?JSON.stringify(t):void 0});if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}async function h(r,t){const e=await fetch(`${o}${r}`,{method:"PUT",headers:await a(),body:t?JSON.stringify(t):void 0});if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}async function u(r){const t=await fetch(`${o}${r}`,{method:"DELETE",headers:await a()});if(!t.ok)throw new Error(`API error: ${t.status}`);return t.json()}export{u as a,i as b,c,h as d};
1
+ import{q as n}from"./index-BxzKpjKp.js";const o="/api";async function a(){const r=n(),t={"Content-Type":"application/json"};return r.token&&(t.Authorization=`Bearer ${r.token}`),t}async function i(r){const t=await fetch(`${o}${r}`,{headers:await a()});if(!t.ok)throw new Error(`API error: ${t.status}`);return t.json()}async function c(r,t){const e=await fetch(`${o}${r}`,{method:"POST",headers:await a(),body:t?JSON.stringify(t):void 0});if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}async function h(r,t){const e=await fetch(`${o}${r}`,{method:"PUT",headers:await a(),body:t?JSON.stringify(t):void 0});if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}async function u(r){const t=await fetch(`${o}${r}`,{method:"DELETE",headers:await a()});if(!t.ok)throw new Error(`API error: ${t.status}`);return t.json()}export{u as a,i as b,c,h as d};