heyio 1.11.2 → 1.12.1

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 (34) hide show
  1. package/dist/api/server.js +4 -3
  2. package/dist/copilot/skills.js +50 -13
  3. package/package.json +1 -1
  4. package/web-dist/assets/{AuditLogView-876aBvp7.js → AuditLogView-C5QtUQBq.js} +1 -1
  5. package/web-dist/assets/ChatView-DLu9BMg8.js +1 -0
  6. package/web-dist/assets/{FeedView-Hr_p36PL.js → FeedView-6OV-l6Gl.js} +1 -1
  7. package/web-dist/assets/{HistoryView-D6AsI2YL.js → HistoryView-DizPqv0y.js} +1 -1
  8. package/web-dist/assets/{LoginView-JFudvzT9.js → LoginView-CG1O9fmR.js} +1 -1
  9. package/web-dist/assets/{McpView-DEKaxHvM.js → McpView-TJN-fZvI.js} +1 -1
  10. package/web-dist/assets/SchedulesView-BDFpImX6.js +6 -0
  11. package/web-dist/assets/{SettingsView--XVajvM6.js → SettingsView-D-K1iC1c.js} +1 -1
  12. package/web-dist/assets/{SkillsView-FxiFscAg.js → SkillsView-DnNmO192.js} +1 -1
  13. package/web-dist/assets/{SquadDetailView-yBpF2HPs.js → SquadDetailView-BBvrgHzn.js} +1 -1
  14. package/web-dist/assets/{SquadHealthView-tpKwrIpk.js → SquadHealthView-DF2zF9D3.js} +1 -1
  15. package/web-dist/assets/{SquadsView-B4DU2TM2.js → SquadsView-CPVzko7k.js} +1 -1
  16. package/web-dist/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-DLrXkvGe.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-Bk_t9_Rn.js} +1 -1
  17. package/web-dist/assets/{UsageView-8b6--5tz.js → UsageView-OcyM5k14.js} +1 -1
  18. package/web-dist/assets/{WikiView-wviS2lbH.js → WikiView-KhFqBZI0.js} +1 -1
  19. package/web-dist/assets/{api-CSt4Y_SE.js → api-BiDVwQrs.js} +1 -1
  20. package/web-dist/assets/{arrow-left-r91jNdw5.js → arrow-left-DFbf2tii.js} +1 -1
  21. package/web-dist/assets/{git-branch-DaWa7Suo.js → git-branch-BLstr_Gr.js} +1 -1
  22. package/web-dist/assets/index-B-o45ao1.css +1 -0
  23. package/web-dist/assets/{index-Bu8BI3Ga.js → index-DCJUYZtV.js} +12 -12
  24. package/web-dist/assets/{pencil-92uBAIoQ.js → pencil-D4Zz_t0y.js} +1 -1
  25. package/web-dist/assets/{plus-BWduphxA.js → plus-gmwiZVfr.js} +1 -1
  26. package/web-dist/assets/{save-sgq5DeZs.js → save-BvtAs5WB.js} +1 -1
  27. package/web-dist/assets/{search-Y6VQntGe.js → search-BabUvoGD.js} +1 -1
  28. package/web-dist/assets/{trash-2-C6yGK69f.js → trash-2-C21cNLJl.js} +1 -1
  29. package/web-dist/assets/{triangle-alert-ARN9gQNZ.js → triangle-alert-BrzY_E1n.js} +1 -1
  30. package/web-dist/assets/{x-TC2ojICC.js → x-xgLSmc9e.js} +1 -1
  31. package/web-dist/index.html +2 -2
  32. package/web-dist/assets/ChatView-BZEl1ckK.js +0 -1
  33. package/web-dist/assets/SchedulesView-9rmg2Q74.js +0 -6
  34. package/web-dist/assets/index-vcgp2T40.css +0 -1
@@ -326,7 +326,8 @@ export async function startApiServer(config) {
326
326
  return;
327
327
  }
328
328
  try {
329
- const content = await fetchRemoteSkillPreview(source, slug);
329
+ const sourceRepo = req.query.sourceRepo;
330
+ const content = await fetchRemoteSkillPreview(source, slug, sourceRepo);
330
331
  res.json({ content });
331
332
  }
332
333
  catch (err) {
@@ -335,13 +336,13 @@ export async function startApiServer(config) {
335
336
  });
336
337
  app.post("/api/skills", async (req, res) => {
337
338
  try {
338
- const { url, source, slug, content } = req.body;
339
+ const { url, source, slug, content, sourceRepo } = req.body;
339
340
  if (source && slug) {
340
341
  if (source !== "awesome-copilot" && source !== "skillssh") {
341
342
  res.status(400).json({ error: "source must be 'awesome-copilot' or 'skillssh'" });
342
343
  return;
343
344
  }
344
- await installFromSource(source, slug);
345
+ await installFromSource(source, slug, sourceRepo);
345
346
  }
346
347
  else if (url && typeof url === "string") {
347
348
  // Git-clone method
@@ -142,20 +142,24 @@ async function fetchAwesomeCopilotSkills() {
142
142
  const text = await res.text();
143
143
  return parseAwesomeCopilotTable(text);
144
144
  }
145
- async function fetchSkillsShSkills() {
145
+ async function fetchSkillsShSkills(query) {
146
146
  try {
147
- const res = await fetch("https://skills.sh/api/skills", {
147
+ const searchQuery = query?.trim() || "";
148
+ const url = `https://skills.sh/api/search?q=${encodeURIComponent(searchQuery)}`;
149
+ const res = await fetch(url, {
148
150
  headers: { Accept: "application/json" },
149
151
  signal: AbortSignal.timeout(10_000),
150
152
  });
151
153
  if (!res.ok)
152
154
  return [];
153
155
  const data = (await res.json());
154
- return data.map((item) => ({
155
- slug: item.slug ?? item.name ?? "",
156
- name: item.name ?? item.slug ?? "",
157
- description: item.description ?? "",
156
+ return data.skills.map((item) => ({
157
+ slug: item.skillId || item.name || "",
158
+ name: item.name || item.skillId || "",
159
+ description: "",
158
160
  source: "skillssh",
161
+ sourceRepo: item.source,
162
+ installs: item.installs,
159
163
  }));
160
164
  }
161
165
  catch {
@@ -163,16 +167,18 @@ async function fetchSkillsShSkills() {
163
167
  }
164
168
  }
165
169
  export async function discoverSkills(source, query) {
170
+ // For skills.sh, use the search API directly with the query
171
+ if (source === "skillssh") {
172
+ return fetchSkillsShSkills(query);
173
+ }
174
+ // For awesome-copilot, use caching and client-side filtering
166
175
  const cached = DISCOVERY_CACHE.get(source);
167
176
  let skills;
168
177
  if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
169
178
  skills = cached.skills;
170
179
  }
171
180
  else {
172
- skills =
173
- source === "awesome-copilot"
174
- ? await fetchAwesomeCopilotSkills()
175
- : await fetchSkillsShSkills();
181
+ skills = await fetchAwesomeCopilotSkills();
176
182
  DISCOVERY_CACHE.set(source, { skills, fetchedAt: Date.now() });
177
183
  }
178
184
  if (query) {
@@ -181,28 +187,59 @@ export async function discoverSkills(source, query) {
181
187
  }
182
188
  return skills;
183
189
  }
190
+ /**
191
+ * Find the path to SKILL.md in a GitHub repo by searching the repo tree.
192
+ * Returns the full path (e.g., "skills/features/clerk-testing/SKILL.md").
193
+ */
194
+ async function findSkillPathInRepo(repoPath, skillId) {
195
+ const treeUrl = `https://api.github.com/repos/${repoPath}/git/trees/main?recursive=1`;
196
+ const res = await fetch(treeUrl, { signal: AbortSignal.timeout(10_000) });
197
+ if (!res.ok) {
198
+ throw new Error(`Failed to fetch repo tree for "${repoPath}": HTTP ${res.status}`);
199
+ }
200
+ const data = (await res.json());
201
+ // Look for a SKILL.md file in a folder named after the skillId
202
+ const targetSuffix = `${skillId}/SKILL.md`;
203
+ const match = data.tree.find((item) => item.type === "blob" && item.path.endsWith(targetSuffix));
204
+ if (!match) {
205
+ throw new Error(`Could not find SKILL.md for "${skillId}" in repo "${repoPath}"`);
206
+ }
207
+ return match.path;
208
+ }
184
209
  function remoteSkillMdUrl(source, safeSlug) {
185
210
  const encodedSlug = encodeURIComponent(safeSlug);
186
211
  if (source === "awesome-copilot") {
187
212
  return `https://raw.githubusercontent.com/github/awesome-copilot/main/skills/${encodedSlug}/SKILL.md`;
188
213
  }
214
+ // Legacy fallback for skillssh without sourceRepo (shouldn't be used anymore)
189
215
  return `https://skills.sh/skills/${encodedSlug}/SKILL.md`;
190
216
  }
191
- export async function fetchRemoteSkillPreview(source, slug) {
217
+ export async function fetchRemoteSkillPreview(source, slug, sourceRepo) {
192
218
  const safeSlug = validateSlug(slug);
219
+ // For skillssh with a sourceRepo, use GitHub directly
220
+ if (source === "skillssh" && sourceRepo) {
221
+ const skillPath = await findSkillPathInRepo(sourceRepo, safeSlug);
222
+ const rawUrl = `https://raw.githubusercontent.com/${sourceRepo}/main/${skillPath}`;
223
+ const res = await fetch(rawUrl, { signal: AbortSignal.timeout(10_000) });
224
+ if (!res.ok) {
225
+ throw new Error(`Failed to fetch preview for "${safeSlug}": HTTP ${res.status}`);
226
+ }
227
+ return res.text();
228
+ }
229
+ // Fallback to legacy URL approach
193
230
  const url = remoteSkillMdUrl(source, safeSlug);
194
231
  const res = await fetch(url, { signal: AbortSignal.timeout(10_000) });
195
232
  if (!res.ok)
196
233
  throw new Error(`Failed to fetch preview for "${safeSlug}": HTTP ${res.status}`);
197
234
  return res.text();
198
235
  }
199
- export async function installFromSource(source, slug) {
236
+ export async function installFromSource(source, slug, sourceRepo) {
200
237
  const safeSlug = validateSlug(slug);
201
238
  const dest = join(PATHS.skills, safeSlug);
202
239
  if (existsSync(dest)) {
203
240
  throw new Error(`Skill "${safeSlug}" is already installed.`);
204
241
  }
205
- const content = await fetchRemoteSkillPreview(source, safeSlug);
242
+ const content = await fetchRemoteSkillPreview(source, safeSlug, sourceRepo);
206
243
  mkdirSync(dest, { recursive: true });
207
244
  writeFileSync(join(dest, "SKILL.md"), content);
208
245
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heyio",
3
- "version": "1.11.2",
3
+ "version": "1.12.1",
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{r as W,u as X,E as Z,J as a,q as d,n as o,t as A,T as N,b as V,s as S,R as l,a4 as f,$ as T,d as h,L as w,a0 as L,p as b,K as n,m as _,z as ee}from"./index-Bu8BI3Ga.js";import{b as F}from"./api-CSt4Y_SE.js";/**
1
+ import{r as W,u as X,E as Z,J as a,q as d,n as o,t as A,T as N,b as V,s as S,R as l,a4 as f,$ as T,d as h,L as w,a0 as L,p as b,K as n,m as _,z as ee}from"./index-DCJUYZtV.js";import{b as F}from"./api-BiDVwQrs.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -0,0 +1 @@
1
+ import{u as R,W as U,a2 as T,E as X,J as a,q as r,n as o,T as s,t as A,p,d as C,L as S,R as d,w as x,M as W,f as Y,P as J,a4 as Q,a0 as G,o as m,S as Z,j as ee,z as k,K as v,m as I,v as te,a1 as se,_ as ae,x as D,Q as ne,I as j,F as H,l as oe,y as M}from"./index-DCJUYZtV.js";import{X as re}from"./x-xgLSmc9e.js";const le={class:"flex flex-col h-full"},ie={key:0,class:"flex items-center justify-center h-full"},ce={class:"text-center text-muted-foreground"},ue={key:0,class:"mb-2 space-y-2"},de=["src","alt"],fe={class:"flex items-center gap-2 text-xs"},pe={class:"truncate"},me={class:"opacity-70"},ve={key:2,class:"text-muted-foreground"},he={key:3,class:"inline-block w-2 h-4 bg-current animate-pulse ml-1"},ge={key:0,class:"mb-2 space-y-2"},xe={class:"flex flex-wrap gap-2"},ye={class:"max-w-[170px] truncate"},_e={class:"opacity-70"},be=["onClick"],ke={class:"text-xs text-muted-foreground"},we={key:1,class:"text-xs text-destructive mb-2"},Te={class:"flex gap-2 items-end"},Ae=["disabled"],Ce=["disabled"],ze=R({__name:"ChatView",setup(Se){const c=U(),h=v(""),f=v(""),y=v(),_=v(),i=v([]),g=v(),b=v(!1),N=I(()=>i.value.reduce((e,n)=>e+n.size,0)),z=I(()=>!c.isStreaming&&(h.value.trim().length>0||i.value.length>0));async function B(e){if(!e||e.length===0)return;f.value="";const n=[];try{for(const u of Array.from(e))n.push(await te(u))}catch(u){f.value=(u==null?void 0:u.message)??"Unable to read one or more files.";return}const t=[...i.value,...n],l=se(t);if(!l.ok){f.value=l.error;return}i.value=t,_.value&&(_.value.value="")}function P(e){i.value.splice(e,1),f.value=""}function V(){var e;(e=_.value)==null||e.click()}function F(e){const n=e.target;B((n==null?void 0:n.files)??null)}async function E(){if(!z.value)return;const e=h.value.trim(),n=[...i.value],t=e||"Please review the attached file(s).";h.value="",i.value=[],f.value="",await c.sendMessage(t,n)}function w(){y.value&&(y.value.scrollTop=y.value.scrollHeight)}function $(){g.value&&(g.value.style.height="auto",g.value.style.height=`${Math.min(g.value.scrollHeight,120)}px`)}function K(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),E())}function L(e){e.preventDefault(),b.value=!0}function q(e){e.preventDefault(),b.value=!1}async function O(e){var n;e.preventDefault(),b.value=!1,await B(((n=e.dataTransfer)==null?void 0:n.files)??null)}return T(()=>c.messages.map(e=>e.content),async()=>{await M(),w()},{deep:!0}),T(()=>c.messages.length,async()=>{await M(),w()}),T(()=>h.value,async()=>{await M(),$()}),X(()=>{$(),w()}),(e,n)=>(a(),r("div",le,[o("div",{ref_key:"messagesContainer",ref:y,class:"flex-1 overflow-y-auto p-4 space-y-4"},[s(c).messages.length===0?(a(),r("div",ie,[o("div",ce,[A(ae,{size:56,class:"mx-auto mb-4"}),n[1]||(n[1]=o("p",{class:"text-lg font-medium"},"Welcome to IO",-1)),n[2]||(n[2]=o("p",{class:"text-sm mt-1"},"Send a message to get started.",-1))])])):p("",!0),(a(!0),r(C,null,S(s(c).messages,t=>(a(),r("div",{key:t.id,class:k(["flex",t.role==="user"?"justify-end":"justify-start"])},[o("div",{class:k(["max-w-[75%] rounded-lg px-4 py-2 text-sm",t.role==="user"?"bg-primary text-primary-foreground":"bg-muted text-foreground"])},[t.attachments.length>0?(a(),r("div",ue,[(a(!0),r(C,null,S(t.attachments,(l,u)=>(a(),r("div",{key:`${t.id}-${u}`,class:"rounded border border-border/50 p-2 bg-background/70 text-foreground"},[s(D)(l)?(a(),r("img",{key:0,src:s(ne)(l),alt:l.name,class:"max-h-44 rounded mb-1 object-contain"},null,8,de)):p("",!0),o("div",fe,[s(D)(l)?(a(),m(s(j),{key:0,class:"w-3.5 h-3.5"})):(a(),m(s(H),{key:1,class:"w-3.5 h-3.5"})),o("span",pe,d(l.name),1),o("span",me,d(s(x)(l.size)),1)])]))),128))])):p("",!0),t.content?(a(),m(oe,{key:1,content:t.content,class:k(t.role==="user"?"prose-invert":"")},null,8,["content","class"])):t.streaming?p("",!0):(a(),r("span",ve,"...")),t.streaming?(a(),r("div",he)):p("",!0)],2)],2))),128))],512),o("div",{class:k(["border-t border-border p-4",b.value?"bg-accent/40":""]),onDragover:L,onDragleave:q,onDrop:O},[o("input",{ref_key:"fileInput",ref:_,type:"file",multiple:"",class:"hidden",onChange:F},null,544),i.value.length>0?(a(),r("div",ge,[o("div",xe,[(a(!0),r(C,null,S(i.value,(t,l)=>(a(),r("div",{key:`${t.name}-${l}`,class:"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs bg-muted"},[s(D)(t)?(a(),m(s(j),{key:0,class:"w-3.5 h-3.5"})):(a(),m(s(H),{key:1,class:"w-3.5 h-3.5"})),o("span",ye,d(t.name),1),o("span",_e,d(s(x)(t.size)),1),o("button",{class:"hover:text-destructive",onClick:u=>P(l)},[A(s(re),{class:"w-3.5 h-3.5"})],8,be)]))),128))]),o("p",ke,d(s(x)(N.value))+" attached · Max per file "+d(s(x)(s(W)))+" · Max total "+d(s(x)(s(Y))),1)])):p("",!0),f.value?(a(),r("p",we,d(f.value),1)):p("",!0),o("div",Te,[o("button",{class:"rounded-md border border-input p-2 hover:bg-accent disabled:opacity-50",disabled:s(c).isStreaming,onClick:V,title:"Attach files"},[A(s(J),{class:"w-4 h-4"})],8,Ae),Q(o("textarea",{ref_key:"textareaRef",ref:g,"onUpdate:modelValue":n[0]||(n[0]=t=>h.value=t),onKeydown:K,placeholder:"Send a message...",rows:"1",class:"flex-1 resize-none rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring min-h-[40px] max-h-[120px]"},null,544),[[G,h.value]]),o("button",{onClick:E,disabled:!z.value,class:"rounded-md bg-primary text-primary-foreground p-2 hover:bg-primary/90 disabled:opacity-50 transition-colors"},[s(c).isStreaming?(a(),m(s(ee),{key:1,class:"w-4 h-4"})):(a(),m(s(Z),{key:0,class:"w-4 h-4"}))],8,Ce)])],34)]))}});export{ze as default};
@@ -1,4 +1,4 @@
1
- import{r as M,u as D,E as N,J as o,q as n,n as a,d as h,L as b,t as c,T as i,e as V,K as d,m as z,z as f,R as p,D as B,a6 as k,p as q,l as T}from"./index-Bu8BI3Ga.js";import{b as C,c as E,a as P}from"./api-CSt4Y_SE.js";import{g as R}from"./squad-colors-B8B_Y-lz.js";import{T as j}from"./trash-2-C6yGK69f.js";/**
1
+ import{r as M,u as D,E as N,J as o,q as n,n as a,d as h,L as b,t as c,T as i,e as V,K as d,m as z,z as f,R as p,D as B,a6 as k,p as q,l as T}from"./index-DCJUYZtV.js";import{b as C,c as E,a as P}from"./api-BiDVwQrs.js";import{g as R}from"./squad-colors-B8B_Y-lz.js";import{T as j}from"./trash-2-C21cNLJl.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{u as q,a2 as F,E as z,J as r,q as n,n as t,t as d,T as c,H as M,a4 as T,a0 as L,g as E,p as x,d as $,L as A,z as p,R as g,K as l,m as P,o as R,l as G}from"./index-Bu8BI3Ga.js";import{b as B,a as J}from"./api-CSt4Y_SE.js";import{S as K}from"./search-Y6VQntGe.js";import{A as Q}from"./arrow-left-r91jNdw5.js";import{T as I}from"./trash-2-C6yGK69f.js";const O={class:"flex h-full"},W={class:"p-3 border-b border-border space-y-2"},X={class:"flex items-center gap-2"},Y={class:"relative"},Z={class:"flex gap-2"},ee={class:"flex-1"},te={class:"flex-1"},se={class:"flex-1 overflow-y-auto"},oe={key:0,class:"p-4 text-xs text-muted-foreground"},re={key:1,class:"flex flex-col items-center justify-center h-full p-6 text-center text-muted-foreground"},ne=["onClick"],ae={class:"flex-1 min-w-0"},le={class:"text-xs text-foreground line-clamp-2"},ie={class:"flex items-center gap-2 mt-1"},ue={class:"text-xs text-muted-foreground"},de={class:"text-xs text-muted-foreground"},ce=["onClick"],fe={key:2,class:"p-3 text-center"},ve={key:0,class:"flex-1 flex flex-col"},me={class:"flex items-center gap-2 px-4 py-2 border-b border-border"},xe={class:"text-sm font-medium text-muted-foreground"},pe={class:"flex-1 overflow-y-auto p-4 space-y-4"},ge={key:0,class:"text-center text-xs text-muted-foreground py-8"},he={class:"text-xs mt-1 opacity-60"},ye={key:1,class:"hidden md:flex flex-1 items-center justify-center text-muted-foreground"},be={class:"text-center"},_e=50,De=q({__name:"HistoryView",setup(we){const a=l([]),h=l(0),y=l(!0),f=l(""),v=l(""),m=l(""),u=l(null),b=l([]),_=l(!1),w=l(0);async function k(o=!0){y.value=!0;try{o&&(w.value=0,a.value=[]);const e=new URLSearchParams;f.value&&e.set("q",f.value),v.value&&e.set("from",v.value),m.value&&e.set("to",m.value+"T23:59:59"),e.set("limit",String(_e)),e.set("offset",String(w.value));const i=await B(`/history?${e.toString()}`);a.value=o?i.items:[...a.value,...i.items],h.value=i.total,w.value+=i.items.length}finally{y.value=!1}}async function j(o){u.value=o,_.value=!0;try{b.value=await B(`/history/${o}`)}finally{_.value=!1}}function D(){u.value=null,b.value=[]}async function H(o,e){e.stopPropagation(),confirm("Delete this conversation?")&&(await J(`/history/${o}`),a.value=a.value.filter(i=>i.id!==o),h.value=Math.max(0,h.value-1),u.value===o&&D())}function C(o){return new Date(o).toLocaleString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function N(o,e=100){return o.length>e?o.slice(0,e)+"…":o}const U=P(()=>a.value.length<h.value);let S=null;return F([f,v,m],()=>{S&&clearTimeout(S),S=setTimeout(()=>k(!0),300)}),z(()=>k(!0)),(o,e)=>{var i;return r(),n("div",O,[t("div",{class:p(["flex flex-col border-r border-border",u.value?"hidden md:flex w-80 shrink-0":"flex-1"])},[t("div",W,[t("div",X,[d(c(M),{class:"w-4 h-4 text-muted-foreground"}),e[4]||(e[4]=t("span",{class:"text-sm font-medium"},"Conversation History",-1))]),t("div",Y,[d(c(K),{class:"absolute left-2.5 top-2.5 w-3.5 h-3.5 text-muted-foreground"}),T(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>f.value=s),placeholder:"Search conversations...",class:"w-full rounded-md border border-input bg-background pl-8 pr-3 py-2 text-xs focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[L,f.value]])]),t("div",Z,[t("div",ee,[e[5]||(e[5]=t("label",{class:"text-xs text-muted-foreground block mb-1"},"From",-1)),T(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>v.value=s),type:"date",class:"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[L,v.value]])]),t("div",te,[e[6]||(e[6]=t("label",{class:"text-xs text-muted-foreground block mb-1"},"To",-1)),T(t("input",{"onUpdate:modelValue":e[2]||(e[2]=s=>m.value=s),type:"date",class:"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[L,m.value]])])])]),t("div",se,[y.value&&a.value.length===0?(r(),n("div",oe," Loading... ")):a.value.length===0?(r(),n("div",re,[d(c(E),{class:"w-10 h-10 mb-3 opacity-40"}),e[7]||(e[7]=t("p",{class:"text-sm"},"No conversations found.",-1)),e[8]||(e[8]=t("p",{class:"text-xs mt-1"},"Start chatting to build up your history.",-1))])):x("",!0),(r(!0),n($,null,A(a.value,s=>(r(),n("div",{key:s.id,class:p(["group flex items-start gap-2 px-3 py-3 border-b border-border cursor-pointer hover:bg-accent/50 transition-colors",u.value===s.id?"bg-accent":""]),onClick:V=>j(s.id)},[t("div",ae,[t("p",le,g(N(s.preview)),1),t("div",ie,[t("span",ue,g(C(s.updatedAt)),1),t("span",de,"· "+g(s.messageCount)+" msgs",1)])]),t("button",{class:"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive transition-all",title:"Delete",onClick:V=>H(s.id,V)},[d(c(I),{class:"w-3.5 h-3.5"})],8,ce)],10,ne))),128)),U.value?(r(),n("div",fe,[t("button",{class:"text-xs text-muted-foreground hover:text-foreground underline",onClick:e[3]||(e[3]=s=>k(!1))}," Load more ")])):x("",!0)])],2),u.value?(r(),n("div",ve,[t("div",me,[t("button",{class:"p-1.5 rounded hover:bg-accent text-muted-foreground",title:"Back",onClick:D},[d(c(Q),{class:"w-4 h-4"})]),t("span",xe,g(C(((i=a.value.find(s=>s.id===u.value))==null?void 0:i.startedAt)??"")),1)]),t("div",pe,[_.value?(r(),n("div",ge," Loading... ")):x("",!0),(r(!0),n($,null,A(b.value,s=>(r(),n("div",{key:s.id,class:p(["flex",s.role==="user"?"justify-end":"justify-start"])},[t("div",{class:p(["max-w-[75%] rounded-lg px-4 py-2 text-sm",s.role==="user"?"bg-blue-600 text-white":"bg-muted text-foreground"])},[s.content?(r(),R(G,{key:0,content:s.content,class:p(s.role==="user"?"prose-invert":"")},null,8,["content","class"])):x("",!0),t("p",he,g(C(s.createdAt)),1)],2)],2))),128))])])):u.value?x("",!0):(r(),n("div",ye,[t("div",be,[d(c(M),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[9]||(e[9]=t("p",null,"Select a conversation to view",-1))])]))])}}});export{De as default};
1
+ import{u as q,a2 as F,E as z,J as r,q as n,n as t,t as d,T as c,H as M,a4 as T,a0 as L,g as E,p as x,d as $,L as A,z as p,R as g,K as l,m as P,o as R,l as G}from"./index-DCJUYZtV.js";import{b as B,a as J}from"./api-BiDVwQrs.js";import{S as K}from"./search-BabUvoGD.js";import{A as Q}from"./arrow-left-DFbf2tii.js";import{T as I}from"./trash-2-C21cNLJl.js";const O={class:"flex h-full"},W={class:"p-3 border-b border-border space-y-2"},X={class:"flex items-center gap-2"},Y={class:"relative"},Z={class:"flex gap-2"},ee={class:"flex-1"},te={class:"flex-1"},se={class:"flex-1 overflow-y-auto"},oe={key:0,class:"p-4 text-xs text-muted-foreground"},re={key:1,class:"flex flex-col items-center justify-center h-full p-6 text-center text-muted-foreground"},ne=["onClick"],ae={class:"flex-1 min-w-0"},le={class:"text-xs text-foreground line-clamp-2"},ie={class:"flex items-center gap-2 mt-1"},ue={class:"text-xs text-muted-foreground"},de={class:"text-xs text-muted-foreground"},ce=["onClick"],fe={key:2,class:"p-3 text-center"},ve={key:0,class:"flex-1 flex flex-col"},me={class:"flex items-center gap-2 px-4 py-2 border-b border-border"},xe={class:"text-sm font-medium text-muted-foreground"},pe={class:"flex-1 overflow-y-auto p-4 space-y-4"},ge={key:0,class:"text-center text-xs text-muted-foreground py-8"},he={class:"text-xs mt-1 opacity-60"},ye={key:1,class:"hidden md:flex flex-1 items-center justify-center text-muted-foreground"},be={class:"text-center"},_e=50,De=q({__name:"HistoryView",setup(we){const a=l([]),h=l(0),y=l(!0),f=l(""),v=l(""),m=l(""),u=l(null),b=l([]),_=l(!1),w=l(0);async function k(o=!0){y.value=!0;try{o&&(w.value=0,a.value=[]);const e=new URLSearchParams;f.value&&e.set("q",f.value),v.value&&e.set("from",v.value),m.value&&e.set("to",m.value+"T23:59:59"),e.set("limit",String(_e)),e.set("offset",String(w.value));const i=await B(`/history?${e.toString()}`);a.value=o?i.items:[...a.value,...i.items],h.value=i.total,w.value+=i.items.length}finally{y.value=!1}}async function j(o){u.value=o,_.value=!0;try{b.value=await B(`/history/${o}`)}finally{_.value=!1}}function D(){u.value=null,b.value=[]}async function H(o,e){e.stopPropagation(),confirm("Delete this conversation?")&&(await J(`/history/${o}`),a.value=a.value.filter(i=>i.id!==o),h.value=Math.max(0,h.value-1),u.value===o&&D())}function C(o){return new Date(o).toLocaleString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function N(o,e=100){return o.length>e?o.slice(0,e)+"…":o}const U=P(()=>a.value.length<h.value);let S=null;return F([f,v,m],()=>{S&&clearTimeout(S),S=setTimeout(()=>k(!0),300)}),z(()=>k(!0)),(o,e)=>{var i;return r(),n("div",O,[t("div",{class:p(["flex flex-col border-r border-border",u.value?"hidden md:flex w-80 shrink-0":"flex-1"])},[t("div",W,[t("div",X,[d(c(M),{class:"w-4 h-4 text-muted-foreground"}),e[4]||(e[4]=t("span",{class:"text-sm font-medium"},"Conversation History",-1))]),t("div",Y,[d(c(K),{class:"absolute left-2.5 top-2.5 w-3.5 h-3.5 text-muted-foreground"}),T(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>f.value=s),placeholder:"Search conversations...",class:"w-full rounded-md border border-input bg-background pl-8 pr-3 py-2 text-xs focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[L,f.value]])]),t("div",Z,[t("div",ee,[e[5]||(e[5]=t("label",{class:"text-xs text-muted-foreground block mb-1"},"From",-1)),T(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>v.value=s),type:"date",class:"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[L,v.value]])]),t("div",te,[e[6]||(e[6]=t("label",{class:"text-xs text-muted-foreground block mb-1"},"To",-1)),T(t("input",{"onUpdate:modelValue":e[2]||(e[2]=s=>m.value=s),type:"date",class:"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[L,m.value]])])])]),t("div",se,[y.value&&a.value.length===0?(r(),n("div",oe," Loading... ")):a.value.length===0?(r(),n("div",re,[d(c(E),{class:"w-10 h-10 mb-3 opacity-40"}),e[7]||(e[7]=t("p",{class:"text-sm"},"No conversations found.",-1)),e[8]||(e[8]=t("p",{class:"text-xs mt-1"},"Start chatting to build up your history.",-1))])):x("",!0),(r(!0),n($,null,A(a.value,s=>(r(),n("div",{key:s.id,class:p(["group flex items-start gap-2 px-3 py-3 border-b border-border cursor-pointer hover:bg-accent/50 transition-colors",u.value===s.id?"bg-accent":""]),onClick:V=>j(s.id)},[t("div",ae,[t("p",le,g(N(s.preview)),1),t("div",ie,[t("span",ue,g(C(s.updatedAt)),1),t("span",de,"· "+g(s.messageCount)+" msgs",1)])]),t("button",{class:"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive transition-all",title:"Delete",onClick:V=>H(s.id,V)},[d(c(I),{class:"w-3.5 h-3.5"})],8,ce)],10,ne))),128)),U.value?(r(),n("div",fe,[t("button",{class:"text-xs text-muted-foreground hover:text-foreground underline",onClick:e[3]||(e[3]=s=>k(!1))}," Load more ")])):x("",!0)])],2),u.value?(r(),n("div",ve,[t("div",me,[t("button",{class:"p-1.5 rounded hover:bg-accent text-muted-foreground",title:"Back",onClick:D},[d(c(Q),{class:"w-4 h-4"})]),t("span",xe,g(C(((i=a.value.find(s=>s.id===u.value))==null?void 0:i.startedAt)??"")),1)]),t("div",pe,[_.value?(r(),n("div",ge," Loading... ")):x("",!0),(r(!0),n($,null,A(b.value,s=>(r(),n("div",{key:s.id,class:p(["flex",s.role==="user"?"justify-end":"justify-start"])},[t("div",{class:p(["max-w-[75%] rounded-lg px-4 py-2 text-sm",s.role==="user"?"bg-blue-600 text-white":"bg-muted text-foreground"])},[s.content?(r(),R(G,{key:0,content:s.content,class:p(s.role==="user"?"prose-invert":"")},null,8,["content","class"])):x("",!0),t("p",he,g(C(s.createdAt)),1)],2)],2))),128))])])):u.value?x("",!0):(r(),n("div",ye,[t("div",be,[d(c(M),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[9]||(e[9]=t("p",null,"Select a conversation to view",-1))])]))])}}});export{De as default};
@@ -1 +1 @@
1
- import{u as b,V as v,J as u,q as i,n as t,t as y,a6 as w,a4 as m,a0 as p,R as c,p as V,T as f,K as d,_,Y as h}from"./index-Bu8BI3Ga.js";const S={class:"min-h-screen flex items-center justify-center bg-background p-4"},k={class:"w-full max-w-sm space-y-8"},q={class:"text-center"},A={key:0,class:"text-sm text-destructive"},B=["disabled"],L=b({__name:"LoginView",setup(D){const o=v(),g=h(),r=d(""),n=d(""),s=d("");async function x(){s.value="";try{await o.login(r.value,n.value),g.push("/")}catch(l){s.value=l.message??"Login failed"}}return(l,e)=>(u(),i("div",S,[t("div",k,[t("div",q,[y(_,{size:56,class:"mx-auto mb-4"}),e[2]||(e[2]=t("h1",{class:"font-display text-4xl font-normal uppercase tracking-[0.18em] bg-gradient-brand bg-clip-text text-transparent"}," IO ",-1)),e[3]||(e[3]=t("p",{class:"text-sm text-muted-foreground mt-1"},"Sign in to your dashboard",-1))]),t("form",{onSubmit:w(x,["prevent"]),class:"space-y-4 bg-card border border-border rounded-lg p-6"},[t("div",null,[e[4]||(e[4]=t("label",{class:"text-sm font-medium text-muted-foreground",for:"email"},"Email",-1)),m(t("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=a=>r.value=a),type:"email",required:"",class:"mt-1 w-full rounded-md border border-border bg-input px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"you@example.com"},null,512),[[p,r.value]])]),t("div",null,[e[5]||(e[5]=t("label",{class:"text-sm font-medium text-muted-foreground",for:"password"},"Password",-1)),m(t("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=a=>n.value=a),type:"password",required:"",class:"mt-1 w-full rounded-md border border-border bg-input px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"••••••••"},null,512),[[p,n.value]])]),s.value?(u(),i("div",A,c(s.value),1)):V("",!0),t("button",{type:"submit",disabled:f(o).loading,class:"btn-gradient w-full py-2.5"},c(f(o).loading?"Signing in...":"Sign In"),9,B)],32),e[6]||(e[6]=t("p",{class:"text-center text-xs text-muted-foreground"}," Personal AI Assistant Daemon ",-1))])]))}});export{L as default};
1
+ import{u as b,V as v,J as u,q as i,n as t,t as y,a6 as w,a4 as m,a0 as p,R as c,p as V,T as f,K as d,_,Y as h}from"./index-DCJUYZtV.js";const S={class:"min-h-screen flex items-center justify-center bg-background p-4"},k={class:"w-full max-w-sm space-y-8"},q={class:"text-center"},A={key:0,class:"text-sm text-destructive"},B=["disabled"],L=b({__name:"LoginView",setup(D){const o=v(),g=h(),r=d(""),n=d(""),s=d("");async function x(){s.value="";try{await o.login(r.value,n.value),g.push("/")}catch(l){s.value=l.message??"Login failed"}}return(l,e)=>(u(),i("div",S,[t("div",k,[t("div",q,[y(_,{size:56,class:"mx-auto mb-4"}),e[2]||(e[2]=t("h1",{class:"font-display text-4xl font-normal uppercase tracking-[0.18em] bg-gradient-brand bg-clip-text text-transparent"}," IO ",-1)),e[3]||(e[3]=t("p",{class:"text-sm text-muted-foreground mt-1"},"Sign in to your dashboard",-1))]),t("form",{onSubmit:w(x,["prevent"]),class:"space-y-4 bg-card border border-border rounded-lg p-6"},[t("div",null,[e[4]||(e[4]=t("label",{class:"text-sm font-medium text-muted-foreground",for:"email"},"Email",-1)),m(t("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=a=>r.value=a),type:"email",required:"",class:"mt-1 w-full rounded-md border border-border bg-input px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"you@example.com"},null,512),[[p,r.value]])]),t("div",null,[e[5]||(e[5]=t("label",{class:"text-sm font-medium text-muted-foreground",for:"password"},"Password",-1)),m(t("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=a=>n.value=a),type:"password",required:"",class:"mt-1 w-full rounded-md border border-border bg-input px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"••••••••"},null,512),[[p,n.value]])]),s.value?(u(),i("div",A,c(s.value),1)):V("",!0),t("button",{type:"submit",disabled:f(o).loading,class:"btn-gradient w-full py-2.5"},c(f(o).loading?"Signing in...":"Sign In"),9,B)],32),e[6]||(e[6]=t("p",{class:"text-center text-xs text-muted-foreground"}," Personal AI Assistant Daemon ",-1))])]))}});export{L as default};
@@ -1 +1 @@
1
- import{u as E,E as S,J as l,q as a,n as s,t as c,T as b,s as C,a4 as i,a0 as m,$ as M,p as x,i as P,d as $,L as j,K as f,R as p}from"./index-Bu8BI3Ga.js";import{b as U,c as I,d as N,a as L}from"./api-CSt4Y_SE.js";import{_ as O}from"./ToggleSwitch.vue_vue_type_script_setup_true_lang-DLrXkvGe.js";import{P as G}from"./plus-BWduphxA.js";import{T as K}from"./trash-2-C6yGK69f.js";const F={class:"p-6"},Y={class:"flex items-center justify-between mb-6"},B={key:0,class:"border border-border rounded-lg p-4 mb-6 space-y-3 bg-card"},h={class:"grid grid-cols-2 gap-3"},D={key:0},J={key:1},R={key:1,class:"text-muted-foreground"},q={key:2,class:"text-center py-12 text-muted-foreground"},W={key:3,class:"space-y-2"},z={class:"space-y-1"},H={class:"flex items-center gap-2"},Q={class:"font-medium text-sm"},X={class:"text-xs text-muted-foreground bg-secondary px-1.5 py-0.5 rounded"},Z={key:0,class:"text-xs text-muted-foreground"},ee={key:1,class:"text-xs text-muted-foreground"},te={key:2,class:"text-xs text-muted-foreground"},se={class:"flex items-center gap-3"},oe=["onClick"],ie=E({__name:"McpView",setup(ne){const u=f([]),g=f(!0),v=f(!1),o=f({name:"",type:"stdio",command:"",url:"",argsText:"",envText:""});S(async()=>{try{u.value=await U("/mcp")}finally{g.value=!1}});function k(n){return n.split(/\r?\n|,/).map(e=>e.trim()).filter(Boolean)}function w(n){const e={};try{const t=JSON.parse(n);if(t&&typeof t=="object"&&!Array.isArray(t)){for(const[d,r]of Object.entries(t))e[d]=String(r);return e}}catch{}for(const t of n.split(/\r?\n/)){const d=t.trim();if(!d||d.startsWith("#"))continue;const r=d.indexOf("=");if(r===-1)continue;const y=d.slice(0,r).trim(),A=d.slice(r+1).trim();y&&(e[y]=A)}return e}async function _(n){await N(`/mcp/${n.id}`,{enabled:!n.enabled}),n.enabled=!n.enabled}async function T(n){await L(`/mcp/${n}`),u.value=u.value.filter(e=>e.id!==n)}async function V(){const n={name:o.value.name,type:o.value.type,args:k(o.value.argsText),env:w(o.value.envText)};o.value.type==="stdio"?n.command=o.value.command:n.url=o.value.url;const e=await I("/mcp",n);u.value.push(e),v.value=!1,o.value={name:"",type:"stdio",command:"",url:"",argsText:"",envText:""}}return(n,e)=>(l(),a("div",F,[s("div",Y,[e[8]||(e[8]=s("div",null,[s("p",{class:"text-sm font-medium text-primary"},"MCP configuration"),s("h1",{class:"text-2xl font-bold"},"MCP Servers")],-1)),s("button",{onClick:e[0]||(e[0]=t=>v.value=!v.value),class:"btn-gradient inline-flex items-center gap-1"},[c(b(G),{class:"w-4 h-4"}),e[7]||(e[7]=C(" Add Server ",-1))])]),v.value?(l(),a("div",B,[s("div",h,[s("div",null,[e[9]||(e[9]=s("label",{class:"text-sm font-medium"},"Name",-1)),i(s("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>o.value.name=t),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[m,o.value.name]])]),s("div",null,[e[11]||(e[11]=s("label",{class:"text-sm font-medium"},"Type",-1)),i(s("select",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.type=t),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[10]||(e[10]=[s("option",{value:"stdio"},"stdio",-1),s("option",{value:"http"},"http",-1)])],512),[[M,o.value.type]])])]),o.value.type==="stdio"?(l(),a("div",D,[e[12]||(e[12]=s("label",{class:"text-sm font-medium"},"Command",-1)),i(s("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.command=t),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),[[m,o.value.command]])])):(l(),a("div",J,[e[13]||(e[13]=s("label",{class:"text-sm font-medium"},"URL",-1)),i(s("input",{"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.url=t),placeholder:"https://...",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[m,o.value.url]])])),s("div",null,[e[14]||(e[14]=s("label",{class:"text-sm font-medium"},"Command args",-1)),i(s("textarea",{"onUpdate:modelValue":e[5]||(e[5]=t=>o.value.argsText=t),rows:"3",placeholder:"--stdio\n--figma-api-key=${FIGMA_API_KEY}",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[m,o.value.argsText]]),e[15]||(e[15]=s("p",{class:"mt-1 text-xs text-muted-foreground"},"Enter one arg per line or comma-separated.",-1))]),s("div",null,[e[16]||(e[16]=s("label",{class:"text-sm font-medium"},"Environment variables",-1)),i(s("textarea",{"onUpdate:modelValue":e[6]||(e[6]=t=>o.value.envText=t),rows:"4",placeholder:"FIGMA_API_KEY=${FIGMA_API_KEY}\nLOG_LEVEL=debug",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm font-mono"},null,512),[[m,o.value.envText]]),e[17]||(e[17]=s("p",{class:"mt-1 text-xs text-muted-foreground"},"Use KEY=value lines, or paste JSON. Values like ${FIGMA_API_KEY} are preserved.",-1))]),s("div",{class:"flex justify-end"},[s("button",{onClick:V,class:"btn-gradient"},"Save")])])):x("",!0),g.value?(l(),a("div",R,"Loading...")):u.value.length===0?(l(),a("div",q,[c(b(P),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[18]||(e[18]=s("p",null,"No MCP servers configured.",-1))])):(l(),a("div",W,[(l(!0),a($,null,j(u.value,t=>{var d;return l(),a("div",{key:t.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3 bg-card"},[s("div",z,[s("div",H,[s("span",Q,p(t.name),1),s("span",X,p(t.type),1)]),t.command||t.url?(l(),a("div",Z,p(t.command||t.url),1)):x("",!0),(d=t.args)!=null&&d.length?(l(),a("div",ee,"Args: "+p(t.args.join(", ")),1)):x("",!0),t.env&&Object.keys(t.env).length>0?(l(),a("div",te,"Env: "+p(Object.keys(t.env).join(", ")),1)):x("",!0)]),s("div",se,[c(O,{"model-value":t.enabled,"aria-label":`Toggle ${t.name}`,"onUpdate:modelValue":r=>_(t)},null,8,["model-value","aria-label","onUpdate:modelValue"]),s("button",{onClick:r=>T(t.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[c(b(K),{class:"w-4 h-4"})],8,oe)])])}),128))]))]))}});export{ie as default};
1
+ import{u as E,E as S,J as l,q as a,n as s,t as c,T as b,s as C,a4 as i,a0 as m,$ as M,p as x,i as P,d as $,L as j,K as f,R as p}from"./index-DCJUYZtV.js";import{b as U,c as I,d as N,a as L}from"./api-BiDVwQrs.js";import{_ as O}from"./ToggleSwitch.vue_vue_type_script_setup_true_lang-Bk_t9_Rn.js";import{P as G}from"./plus-gmwiZVfr.js";import{T as K}from"./trash-2-C21cNLJl.js";const F={class:"p-6"},Y={class:"flex items-center justify-between mb-6"},B={key:0,class:"border border-border rounded-lg p-4 mb-6 space-y-3 bg-card"},h={class:"grid grid-cols-2 gap-3"},D={key:0},J={key:1},R={key:1,class:"text-muted-foreground"},q={key:2,class:"text-center py-12 text-muted-foreground"},W={key:3,class:"space-y-2"},z={class:"space-y-1"},H={class:"flex items-center gap-2"},Q={class:"font-medium text-sm"},X={class:"text-xs text-muted-foreground bg-secondary px-1.5 py-0.5 rounded"},Z={key:0,class:"text-xs text-muted-foreground"},ee={key:1,class:"text-xs text-muted-foreground"},te={key:2,class:"text-xs text-muted-foreground"},se={class:"flex items-center gap-3"},oe=["onClick"],ie=E({__name:"McpView",setup(ne){const u=f([]),g=f(!0),v=f(!1),o=f({name:"",type:"stdio",command:"",url:"",argsText:"",envText:""});S(async()=>{try{u.value=await U("/mcp")}finally{g.value=!1}});function k(n){return n.split(/\r?\n|,/).map(e=>e.trim()).filter(Boolean)}function w(n){const e={};try{const t=JSON.parse(n);if(t&&typeof t=="object"&&!Array.isArray(t)){for(const[d,r]of Object.entries(t))e[d]=String(r);return e}}catch{}for(const t of n.split(/\r?\n/)){const d=t.trim();if(!d||d.startsWith("#"))continue;const r=d.indexOf("=");if(r===-1)continue;const y=d.slice(0,r).trim(),A=d.slice(r+1).trim();y&&(e[y]=A)}return e}async function _(n){await N(`/mcp/${n.id}`,{enabled:!n.enabled}),n.enabled=!n.enabled}async function T(n){await L(`/mcp/${n}`),u.value=u.value.filter(e=>e.id!==n)}async function V(){const n={name:o.value.name,type:o.value.type,args:k(o.value.argsText),env:w(o.value.envText)};o.value.type==="stdio"?n.command=o.value.command:n.url=o.value.url;const e=await I("/mcp",n);u.value.push(e),v.value=!1,o.value={name:"",type:"stdio",command:"",url:"",argsText:"",envText:""}}return(n,e)=>(l(),a("div",F,[s("div",Y,[e[8]||(e[8]=s("div",null,[s("p",{class:"text-sm font-medium text-primary"},"MCP configuration"),s("h1",{class:"text-2xl font-bold"},"MCP Servers")],-1)),s("button",{onClick:e[0]||(e[0]=t=>v.value=!v.value),class:"btn-gradient inline-flex items-center gap-1"},[c(b(G),{class:"w-4 h-4"}),e[7]||(e[7]=C(" Add Server ",-1))])]),v.value?(l(),a("div",B,[s("div",h,[s("div",null,[e[9]||(e[9]=s("label",{class:"text-sm font-medium"},"Name",-1)),i(s("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>o.value.name=t),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[m,o.value.name]])]),s("div",null,[e[11]||(e[11]=s("label",{class:"text-sm font-medium"},"Type",-1)),i(s("select",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.type=t),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[10]||(e[10]=[s("option",{value:"stdio"},"stdio",-1),s("option",{value:"http"},"http",-1)])],512),[[M,o.value.type]])])]),o.value.type==="stdio"?(l(),a("div",D,[e[12]||(e[12]=s("label",{class:"text-sm font-medium"},"Command",-1)),i(s("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.command=t),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),[[m,o.value.command]])])):(l(),a("div",J,[e[13]||(e[13]=s("label",{class:"text-sm font-medium"},"URL",-1)),i(s("input",{"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.url=t),placeholder:"https://...",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[m,o.value.url]])])),s("div",null,[e[14]||(e[14]=s("label",{class:"text-sm font-medium"},"Command args",-1)),i(s("textarea",{"onUpdate:modelValue":e[5]||(e[5]=t=>o.value.argsText=t),rows:"3",placeholder:"--stdio\n--figma-api-key=${FIGMA_API_KEY}",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[m,o.value.argsText]]),e[15]||(e[15]=s("p",{class:"mt-1 text-xs text-muted-foreground"},"Enter one arg per line or comma-separated.",-1))]),s("div",null,[e[16]||(e[16]=s("label",{class:"text-sm font-medium"},"Environment variables",-1)),i(s("textarea",{"onUpdate:modelValue":e[6]||(e[6]=t=>o.value.envText=t),rows:"4",placeholder:"FIGMA_API_KEY=${FIGMA_API_KEY}\nLOG_LEVEL=debug",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm font-mono"},null,512),[[m,o.value.envText]]),e[17]||(e[17]=s("p",{class:"mt-1 text-xs text-muted-foreground"},"Use KEY=value lines, or paste JSON. Values like ${FIGMA_API_KEY} are preserved.",-1))]),s("div",{class:"flex justify-end"},[s("button",{onClick:V,class:"btn-gradient"},"Save")])])):x("",!0),g.value?(l(),a("div",R,"Loading...")):u.value.length===0?(l(),a("div",q,[c(b(P),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),e[18]||(e[18]=s("p",null,"No MCP servers configured.",-1))])):(l(),a("div",W,[(l(!0),a($,null,j(u.value,t=>{var d;return l(),a("div",{key:t.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3 bg-card"},[s("div",z,[s("div",H,[s("span",Q,p(t.name),1),s("span",X,p(t.type),1)]),t.command||t.url?(l(),a("div",Z,p(t.command||t.url),1)):x("",!0),(d=t.args)!=null&&d.length?(l(),a("div",ee,"Args: "+p(t.args.join(", ")),1)):x("",!0),t.env&&Object.keys(t.env).length>0?(l(),a("div",te,"Env: "+p(Object.keys(t.env).join(", ")),1)):x("",!0)]),s("div",se,[c(O,{"model-value":t.enabled,"aria-label":`Toggle ${t.name}`,"onUpdate:modelValue":r=>_(t)},null,8,["model-value","aria-label","onUpdate:modelValue"]),s("button",{onClick:r=>T(t.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[c(b(K),{class:"w-4 h-4"})],8,oe)])])}),128))]))]))}});export{ie as default};
@@ -0,0 +1,6 @@
1
+ import{r as J,u as G,E as H,J as m,q as p,n as s,t as _,T as k,s as V,d as C,L as P,a4 as S,$ as A,a0 as M,p as T,c as K,R as h,K as b,m as D,z as Y,D as Q}from"./index-DCJUYZtV.js";import{b as I,c as O,d as E,a as X}from"./api-BiDVwQrs.js";import{g as Z}from"./squad-colors-B8B_Y-lz.js";import{_ as ee}from"./ToggleSwitch.vue_vue_type_script_setup_true_lang-Bk_t9_Rn.js";import{P as te}from"./plus-gmwiZVfr.js";import{P as ne}from"./pencil-D4Zz_t0y.js";import{T as re}from"./trash-2-C21cNLJl.js";/**
2
+ * @license lucide-vue-next v0.474.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const oe=J("PlayIcon",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]),se=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ae=["January","February","March","April","May","June","July","August","September","October","November","December"];function $(l,r,o){const n=new Set;if(l==="*"){for(let u=r;u<=o;u+=1)n.add(u);return Array.from(n)}if(l.startsWith("*/")){const u=Number.parseInt(l.slice(2),10);if(Number.isNaN(u)||u<=0)return[];for(let d=r;d<=o;d+=u)n.add(d);return Array.from(n)}const i=l.split(",").map(u=>u.trim()).filter(Boolean);for(const u of i){if(u.includes("-")){const[f,c]=u.split("-"),v=Number.parseInt(f,10),g=Number.parseInt(c,10);if(Number.isNaN(v)||Number.isNaN(g))continue;for(let y=Math.min(v,g);y<=Math.max(v,g);y+=1)y>=r&&y<=o&&n.add(y);continue}const d=Number.parseInt(u,10);!Number.isNaN(d)&&d>=r&&d<=o&&n.add(d)}return Array.from(n)}function q(l,r){const o=(l+11)%12+1,n=l<12?"AM":"PM",i=r.toString().padStart(2,"0");return`${o}:${i} ${n}`}function j(l,r){if(l.length===0)return"";if(l.length===1)return r[l[0]];const o=l.map(n=>r[n]);return o.length===2?`${o[0]} and ${o[1]}`:`${o.slice(0,-1).join(", ")}, and ${o[o.length-1]}`}function de(l){const r=$(l,0,6);if(r.length===0)return"";const o=r.map(c=>c===7?0:c),n=Array.from(new Set(o)).sort((c,v)=>c-v);if(n.length===7)return"every day";const i=[1,2,3,4,5],u=[0,6],d=i.every(c=>n.includes(c))&&n.length===i.length,f=u.every(c=>n.includes(c))&&n.length===u.length;return d?"weekdays":f?"weekends":j(n,se)}function ie(l){const r=$(l,1,12);return r.length===0||r.length===12?"":j(r.map(o=>o-1),ae)}function le(l){const r=$(l,1,31);if(r.length===0||r.length===31)return"";const o=r.map(n=>{const i=[11,12,13].includes(n)?"th":[1,21,31].includes(n)?"st":[2,22].includes(n)?"nd":[3,23].includes(n)?"rd":"th";return`${n}${i}`});return o.length===1?`on the ${o[0]} of the month`:`on the ${o.join(", ")}`}function ue(l,r){const o=$(l,0,59),n=$(r,0,23);if(o.length===0||n.length===0)return"custom times";if(l==="*"&&r==="*")return"every minute";if(l==="*"&&r.startsWith("*/")){const i=Number.parseInt(r.slice(2),10);if(!Number.isNaN(i)&&i>0)return`every ${i} hours`}if(l.startsWith("*/")&&r==="*"){const i=Number.parseInt(l.slice(2),10);if(!Number.isNaN(i)&&i>0)return`every ${i} minutes`}return l==="*"&&n.length===24?"every hour":l==="*"&&n.length===1?`once each hour at ${q(n[0],0)}`:o.length===1&&n.length===1?`at ${q(n[0],o[0])}`:o.length>1&&n.length===1?`at ${o.map(i=>q(n[0],i)).join(", ")}`:n.length>1&&o.length===1?`at ${n.map(i=>q(i,o[0])).join(", ")}`:"at matching times"}function ce(l){const r=l.trim().split(/\s+/);if(r.length!==5)return"custom schedule";const[o,n,i,u,d]=r,f=ue(o,n),c=de(d),v=le(i),g=ie(u);if(f==="every minute")return"every minute";const y=d!=="*"&&i==="*"?`on ${c}`:i!=="*"&&d==="*"?v:d==="*"&&i==="*"?"each day":"on matching days",w=[f,y].filter(N=>N&&N!=="custom times"&&N!=="at matching times");return g&&w.push(`in ${g}`),w.length===0?"custom schedule":w.join(" ")}const me={class:"p-6"},pe={class:"flex items-center justify-between mb-6"},fe={class:"flex gap-1 border-b border-border mb-4"},ve=["onClick"],ge={key:0,class:"border border-border rounded-lg p-4 mb-4 space-y-3"},ye={class:"grid grid-cols-2 gap-3"},be=["value"],xe=["disabled"],he={key:1,class:"text-muted-foreground"},_e={key:2,class:"text-center py-12 text-muted-foreground"},ke={key:3,class:"space-y-2"},we={class:"text-sm font-medium font-mono"},Ne={class:"text-xs text-primary/90 mt-1 font-medium"},Se={key:0,class:"mt-1"},$e={class:"text-xs text-muted-foreground mt-0.5"},qe={key:0,class:"mt-2 space-y-2"},Ce={class:"flex gap-2"},Pe=["onClick"],Me={key:1,class:"mt-2 flex items-center justify-between gap-3"},Te=["onClick"],Ve={class:"text-xs text-muted-foreground mt-0.5"},Ae={class:"flex items-center gap-3"},De=["onClick"],Ie={key:0,class:"text-xs text-green-500 font-medium"},Oe=["onClick"],ze=G({__name:"SchedulesView",setup(l){const r=b([]),o=b([]),n=b(!0),i=b("squad"),u=b(!1),d=b({type:"squad",cron:"",squad_id:"",prompt:""}),f=b(null),c=b(""),v=b(null);H(async()=>{try{const a=await I("/squads");o.value=a.squads,o.value.length>0&&(d.value.squad_id=o.value[0].id),r.value=await I("/schedules")}finally{n.value=!1}});const g=D(()=>r.value.filter(a=>a.type===i.value));async function y(){const a={type:d.value.type,cron:d.value.cron,squad_id:d.value.squad_id};if(!d.value.squad_id||!d.value.prompt.trim())return;a.prompt=d.value.prompt;const e=await O("/schedules",a);r.value.push(e),u.value=!1}function w(a){if(a)return o.value.find(e=>e.id===a)}const N=D(()=>g.value.map(a=>({...a,squad:w(a.squad_id),description:ce(a.cron)})));async function U(a){const e=!a.enabled,t=await E(`/schedules/${a.id}`,{enabled:e});a.enabled=t.enabled}function W(a){f.value=a.id,c.value=a.prompt}async function B(a){const e=await E(`/schedules/${a.id}`,{prompt:c.value});a.prompt=e.prompt,f.value=null,c.value=""}function L(){f.value=null,c.value=""}async function R(a){await X(`/schedules/${a}`),r.value=r.value.filter(e=>e.id!==a)}async function z(a){await O(`/schedules/${a.id}/trigger`,{}),v.value=a.id;const e=r.value.findIndex(t=>t.id===a.id);e!==-1&&(r.value[e]={...r.value[e],last_run:new Date().toISOString()}),setTimeout(()=>{v.value=null},3e3)}function F(a){var e;return a?((e=o.value.find(t=>t.id===a))==null?void 0:e.name)??a:"Unknown squad"}return(a,e)=>(m(),p("div",me,[s("div",pe,[e[8]||(e[8]=s("h1",{class:"text-2xl font-bold"},"Schedules",-1)),s("button",{onClick:e[0]||(e[0]=t=>u.value=!u.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"},[_(k(te),{class:"w-4 h-4"}),e[7]||(e[7]=V(" Add Schedule ",-1))])]),s("div",fe,[(m(),p(C,null,P(["squad","io"],t=>s("button",{key:t,onClick:x=>i.value=t,class:Y(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",i.value===t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},h(t==="squad"?"Squad Schedules":"IO Schedules"),11,ve)),64))]),u.value?(m(),p("div",ge,[s("div",ye,[s("div",null,[e[10]||(e[10]=s("label",{class:"text-sm font-medium"},"Type",-1)),S(s("select",{"onUpdate:modelValue":e[1]||(e[1]=t=>d.value.type=t),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[9]||(e[9]=[s("option",{value:"squad"},"Squad",-1),s("option",{value:"io"},"IO",-1)])],512),[[A,d.value.type]])]),s("div",null,[e[11]||(e[11]=s("label",{class:"text-sm font-medium"},"Cron Expression",-1)),S(s("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>d.value.cron=t),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),[[M,d.value.cron]])])]),s("div",null,[e[12]||(e[12]=s("label",{class:"text-sm font-medium"},"Target Squad",-1)),S(s("select",{"onUpdate:modelValue":e[3]||(e[3]=t=>d.value.squad_id=t),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[(m(!0),p(C,null,P(o.value,t=>(m(),p("option",{key:t.id,value:t.id},h(t.name),9,be))),128))],512),[[A,d.value.squad_id]])]),s("div",null,[e[13]||(e[13]=s("label",{class:"text-sm font-medium"},"Prompt",-1)),S(s("textarea",{"onUpdate:modelValue":e[4]||(e[4]=t=>d.value.prompt=t),rows:"3",placeholder:"e.g. Triage issues, review PRs, ideate on features",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[M,d.value.prompt]])]),s("button",{onClick:y,disabled:!d.value.squad_id||!d.value.prompt.trim(),class:"px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed"}," Save ",8,xe)])):T("",!0),n.value?(m(),p("div",he,"Loading...")):g.value.length===0?(m(),p("div",_e,[_(k(K),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),s("p",null,"No "+h(i.value)+" schedules configured.",1)])):(m(),p("div",ke,[(m(!0),p(C,null,P(N.value,t=>(m(),p("div",{key:t.id,class:"flex items-center justify-between border border-border rounded-lg px-4 py-3"},[s("div",null,[s("div",we,h(t.cron),1),s("div",Ne,"Runs "+h(t.description),1),t.squad?(m(),p("div",Se,[s("span",{class:"text-xs px-2 py-0.5 rounded-full",style:Q(k(Z)(t.squad.color))},h(t.squad.name),5)])):T("",!0),s("div",$e,[f.value===t.id?(m(),p("div",qe,[S(s("textarea",{"onUpdate:modelValue":e[5]||(e[5]=x=>c.value=x),rows:"3",class:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm",placeholder:"Schedule prompt"},null,512),[[M,c.value]]),s("div",Ce,[s("button",{onClick:x=>B(t),class:"px-3 py-1.5 text-xs rounded-md bg-primary text-primary-foreground hover:bg-primary/90"}," Save ",8,Pe),s("button",{onClick:e[6]||(e[6]=x=>L()),class:"px-3 py-1.5 text-xs rounded-md border border-border hover:bg-muted/50"}," Cancel ")])])):(m(),p("div",Me,[s("span",null,h(t.prompt?t.prompt:"(no prompt)"),1),s("button",{onClick:x=>W(t),class:"inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border border-border hover:bg-muted/50"},[_(k(ne),{class:"w-3 h-3"}),e[14]||(e[14]=V(" Edit prompt ",-1))],8,Te)]))]),s("div",Ve," Squad: "+h(F(t.squad_id)),1)]),s("div",Ae,[s("button",{onClick:x=>z(t),class:"p-1.5 rounded hover:bg-primary/10 text-muted-foreground hover:text-primary",title:"Trigger now"},[_(k(oe),{class:"w-4 h-4"})],8,De),v.value===t.id?(m(),p("span",Ie,"Triggered!")):T("",!0),_(ee,{"model-value":!!t.enabled,"aria-label":`Toggle schedule ${t.cron}`,"onUpdate:modelValue":x=>U(t)},null,8,["model-value","aria-label","onUpdate:modelValue"]),s("button",{onClick:x=>R(t.id),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive"},[_(k(re),{class:"w-4 h-4"})],8,Oe)])]))),128))]))]))}});export{ze as default};
@@ -1 +1 @@
1
- import{u as w,E,J as d,q as s,n as t,R as g,d as x,L as U,a4 as o,a0 as n,$ as M,Z as p,p as b,K as r,z as T}from"./index-Bu8BI3Ga.js";import{b as V,d as S}from"./api-CSt4Y_SE.js";const z={class:"p-6"},A={class:"flex items-center justify-between mb-6"},B=["disabled"],N={key:0,class:"text-muted-foreground"},C={class:"flex gap-1 border-b border-border mb-6"},I=["onClick"],K={key:0,class:"space-y-4 max-w-lg"},D={class:"flex items-center gap-3"},L={key:1,class:"space-y-4 max-w-lg"},R={class:"flex items-center gap-3"},j={key:2,class:"space-y-4 max-w-lg"},q={key:3,class:"space-y-4 max-w-lg"},G={class:"flex items-center gap-3"},O={class:"flex items-center gap-3"},W=w({__name:"SettingsView",setup(P){const f=r(!0),i=r(!1),m=r(!1),u=r("general"),y=[{id:"general",label:"General"},{id:"telegram",label:"Telegram"},{id:"auth",label:"Auth"},{id:"advanced",label:"Advanced"}],a=r({defaultModel:"",port:3170,telegramEnabled:!1,telegramBotToken:"",authorizedUserId:null,supabaseUrl:"",supabaseAnonKey:"",authorizedEmail:"",backgroundNotifyMode:"meaningful",backgroundNotifyTelegram:!0,selfEditEnabled:!1,watchdogEnabled:!0});async function k(){f.value=!0;try{const v=await V("/settings");a.value=v}finally{f.value=!1}}async function c(){i.value=!0,m.value=!1;try{await S("/settings",a.value),m.value=!0,setTimeout(()=>m.value=!1,2e3)}finally{i.value=!1}}return E(k),(v,e)=>(d(),s("div",z,[t("div",A,[e[12]||(e[12]=t("h1",{class:"text-2xl font-bold"},"Settings",-1)),t("button",{onClick:c,disabled:i.value,class:"px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm hover:bg-primary/90 disabled:opacity-50"},g(i.value?"Saving...":m.value?"Saved ✓":"Save"),9,B)]),f.value?(d(),s("div",N,"Loading...")):(d(),s(x,{key:1},[t("div",C,[(d(),s(x,null,U(y,l=>t("button",{key:l.id,onClick:$=>u.value=l.id,class:T(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",u.value===l.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},g(l.label),11,I)),64))]),u.value==="general"?(d(),s("div",K,[t("div",null,[e[13]||(e[13]=t("label",{class:"text-sm font-medium"},"Default Model",-1)),o(t("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>a.value.defaultModel=l),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.defaultModel]])]),t("div",null,[e[14]||(e[14]=t("label",{class:"text-sm font-medium"},"Port",-1)),o(t("input",{"onUpdate:modelValue":e[1]||(e[1]=l=>a.value.port=l),type:"number",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.port,void 0,{number:!0}]]),e[15]||(e[15]=t("p",{class:"text-xs text-muted-foreground mt-1"},"Requires restart to take effect",-1))]),t("div",null,[e[17]||(e[17]=t("label",{class:"text-sm font-medium"},"Background Notify Mode",-1)),o(t("select",{"onUpdate:modelValue":e[2]||(e[2]=l=>a.value.backgroundNotifyMode=l),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[16]||(e[16]=[t("option",{value:"all"},"All",-1),t("option",{value:"meaningful"},"Meaningful",-1),t("option",{value:"off"},"Off",-1)])],512),[[M,a.value.backgroundNotifyMode]])]),t("div",D,[o(t("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>a.value.backgroundNotifyTelegram=l),type:"checkbox",id:"notifyTelegram",class:"rounded"},null,512),[[p,a.value.backgroundNotifyTelegram]]),e[18]||(e[18]=t("label",{for:"notifyTelegram",class:"text-sm font-medium"},"Send notifications via Telegram",-1))])])):b("",!0),u.value==="telegram"?(d(),s("div",L,[t("div",null,[e[19]||(e[19]=t("label",{class:"text-sm font-medium"},"Bot Token",-1)),o(t("input",{"onUpdate:modelValue":e[4]||(e[4]=l=>a.value.telegramBotToken=l),type:"password",placeholder:"Enter new token to update",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.telegramBotToken]])]),t("div",null,[e[20]||(e[20]=t("label",{class:"text-sm font-medium"},"Authorized User ID",-1)),o(t("input",{"onUpdate:modelValue":e[5]||(e[5]=l=>a.value.authorizedUserId=l),type:"number",placeholder:"123456789",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.authorizedUserId,void 0,{number:!0}]])]),t("div",R,[o(t("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>a.value.telegramEnabled=l),type:"checkbox",id:"telegramEnabled",class:"rounded"},null,512),[[p,a.value.telegramEnabled]]),e[21]||(e[21]=t("label",{for:"telegramEnabled",class:"text-sm font-medium"},"Enable Telegram Bot",-1))])])):b("",!0),u.value==="auth"?(d(),s("div",j,[t("div",null,[e[22]||(e[22]=t("label",{class:"text-sm font-medium"},"Supabase URL",-1)),o(t("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>a.value.supabaseUrl=l),placeholder:"https://your-project.supabase.co",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.supabaseUrl]])]),t("div",null,[e[23]||(e[23]=t("label",{class:"text-sm font-medium"},"Supabase Anon Key",-1)),o(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>a.value.supabaseAnonKey=l),type:"password",placeholder:"Enter new key to update",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.supabaseAnonKey]])]),t("div",null,[e[24]||(e[24]=t("label",{class:"text-sm font-medium"},"Authorized Email",-1)),o(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>a.value.authorizedEmail=l),type:"email",placeholder:"you@example.com",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.authorizedEmail]])])])):b("",!0),u.value==="advanced"?(d(),s("div",q,[t("div",G,[o(t("input",{"onUpdate:modelValue":e[10]||(e[10]=l=>a.value.selfEditEnabled=l),type:"checkbox",id:"selfEdit",class:"rounded"},null,512),[[p,a.value.selfEditEnabled]]),e[25]||(e[25]=t("div",null,[t("label",{for:"selfEdit",class:"text-sm font-medium"},"Self-Edit Mode"),t("p",{class:"text-xs text-muted-foreground"},"Allow IO to modify its own source code")],-1))]),t("div",O,[o(t("input",{"onUpdate:modelValue":e[11]||(e[11]=l=>a.value.watchdogEnabled=l),type:"checkbox",id:"watchdog",class:"rounded"},null,512),[[p,a.value.watchdogEnabled]]),e[26]||(e[26]=t("div",null,[t("label",{for:"watchdog",class:"text-sm font-medium"},"Watchdog"),t("p",{class:"text-xs text-muted-foreground"},"Monitor event loop and zombie instances")],-1))])])):b("",!0)],64))]))}});export{W as default};
1
+ import{u as w,E,J as d,q as s,n as t,R as g,d as x,L as U,a4 as o,a0 as n,$ as M,Z as p,p as b,K as r,z as T}from"./index-DCJUYZtV.js";import{b as V,d as S}from"./api-BiDVwQrs.js";const z={class:"p-6"},A={class:"flex items-center justify-between mb-6"},B=["disabled"],N={key:0,class:"text-muted-foreground"},C={class:"flex gap-1 border-b border-border mb-6"},I=["onClick"],K={key:0,class:"space-y-4 max-w-lg"},D={class:"flex items-center gap-3"},L={key:1,class:"space-y-4 max-w-lg"},R={class:"flex items-center gap-3"},j={key:2,class:"space-y-4 max-w-lg"},q={key:3,class:"space-y-4 max-w-lg"},G={class:"flex items-center gap-3"},O={class:"flex items-center gap-3"},W=w({__name:"SettingsView",setup(P){const f=r(!0),i=r(!1),m=r(!1),u=r("general"),y=[{id:"general",label:"General"},{id:"telegram",label:"Telegram"},{id:"auth",label:"Auth"},{id:"advanced",label:"Advanced"}],a=r({defaultModel:"",port:3170,telegramEnabled:!1,telegramBotToken:"",authorizedUserId:null,supabaseUrl:"",supabaseAnonKey:"",authorizedEmail:"",backgroundNotifyMode:"meaningful",backgroundNotifyTelegram:!0,selfEditEnabled:!1,watchdogEnabled:!0});async function k(){f.value=!0;try{const v=await V("/settings");a.value=v}finally{f.value=!1}}async function c(){i.value=!0,m.value=!1;try{await S("/settings",a.value),m.value=!0,setTimeout(()=>m.value=!1,2e3)}finally{i.value=!1}}return E(k),(v,e)=>(d(),s("div",z,[t("div",A,[e[12]||(e[12]=t("h1",{class:"text-2xl font-bold"},"Settings",-1)),t("button",{onClick:c,disabled:i.value,class:"px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm hover:bg-primary/90 disabled:opacity-50"},g(i.value?"Saving...":m.value?"Saved ✓":"Save"),9,B)]),f.value?(d(),s("div",N,"Loading...")):(d(),s(x,{key:1},[t("div",C,[(d(),s(x,null,U(y,l=>t("button",{key:l.id,onClick:$=>u.value=l.id,class:T(["px-4 py-2 text-sm font-medium border-b-2 transition-colors",u.value===l.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"])},g(l.label),11,I)),64))]),u.value==="general"?(d(),s("div",K,[t("div",null,[e[13]||(e[13]=t("label",{class:"text-sm font-medium"},"Default Model",-1)),o(t("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>a.value.defaultModel=l),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.defaultModel]])]),t("div",null,[e[14]||(e[14]=t("label",{class:"text-sm font-medium"},"Port",-1)),o(t("input",{"onUpdate:modelValue":e[1]||(e[1]=l=>a.value.port=l),type:"number",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.port,void 0,{number:!0}]]),e[15]||(e[15]=t("p",{class:"text-xs text-muted-foreground mt-1"},"Requires restart to take effect",-1))]),t("div",null,[e[17]||(e[17]=t("label",{class:"text-sm font-medium"},"Background Notify Mode",-1)),o(t("select",{"onUpdate:modelValue":e[2]||(e[2]=l=>a.value.backgroundNotifyMode=l),class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},[...e[16]||(e[16]=[t("option",{value:"all"},"All",-1),t("option",{value:"meaningful"},"Meaningful",-1),t("option",{value:"off"},"Off",-1)])],512),[[M,a.value.backgroundNotifyMode]])]),t("div",D,[o(t("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>a.value.backgroundNotifyTelegram=l),type:"checkbox",id:"notifyTelegram",class:"rounded"},null,512),[[p,a.value.backgroundNotifyTelegram]]),e[18]||(e[18]=t("label",{for:"notifyTelegram",class:"text-sm font-medium"},"Send notifications via Telegram",-1))])])):b("",!0),u.value==="telegram"?(d(),s("div",L,[t("div",null,[e[19]||(e[19]=t("label",{class:"text-sm font-medium"},"Bot Token",-1)),o(t("input",{"onUpdate:modelValue":e[4]||(e[4]=l=>a.value.telegramBotToken=l),type:"password",placeholder:"Enter new token to update",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.telegramBotToken]])]),t("div",null,[e[20]||(e[20]=t("label",{class:"text-sm font-medium"},"Authorized User ID",-1)),o(t("input",{"onUpdate:modelValue":e[5]||(e[5]=l=>a.value.authorizedUserId=l),type:"number",placeholder:"123456789",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.authorizedUserId,void 0,{number:!0}]])]),t("div",R,[o(t("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>a.value.telegramEnabled=l),type:"checkbox",id:"telegramEnabled",class:"rounded"},null,512),[[p,a.value.telegramEnabled]]),e[21]||(e[21]=t("label",{for:"telegramEnabled",class:"text-sm font-medium"},"Enable Telegram Bot",-1))])])):b("",!0),u.value==="auth"?(d(),s("div",j,[t("div",null,[e[22]||(e[22]=t("label",{class:"text-sm font-medium"},"Supabase URL",-1)),o(t("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>a.value.supabaseUrl=l),placeholder:"https://your-project.supabase.co",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.supabaseUrl]])]),t("div",null,[e[23]||(e[23]=t("label",{class:"text-sm font-medium"},"Supabase Anon Key",-1)),o(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>a.value.supabaseAnonKey=l),type:"password",placeholder:"Enter new key to update",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.supabaseAnonKey]])]),t("div",null,[e[24]||(e[24]=t("label",{class:"text-sm font-medium"},"Authorized Email",-1)),o(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>a.value.authorizedEmail=l),type:"email",placeholder:"you@example.com",class:"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm"},null,512),[[n,a.value.authorizedEmail]])])])):b("",!0),u.value==="advanced"?(d(),s("div",q,[t("div",G,[o(t("input",{"onUpdate:modelValue":e[10]||(e[10]=l=>a.value.selfEditEnabled=l),type:"checkbox",id:"selfEdit",class:"rounded"},null,512),[[p,a.value.selfEditEnabled]]),e[25]||(e[25]=t("div",null,[t("label",{for:"selfEdit",class:"text-sm font-medium"},"Self-Edit Mode"),t("p",{class:"text-xs text-muted-foreground"},"Allow IO to modify its own source code")],-1))]),t("div",O,[o(t("input",{"onUpdate:modelValue":e[11]||(e[11]=l=>a.value.watchdogEnabled=l),type:"checkbox",id:"watchdog",class:"rounded"},null,512),[[p,a.value.watchdogEnabled]]),e[26]||(e[26]=t("div",null,[t("label",{for:"watchdog",class:"text-sm font-medium"},"Watchdog"),t("p",{class:"text-xs text-muted-foreground"},"Monitor event loop and zombie instances")],-1))])])):b("",!0)],64))]))}});export{W as default};
@@ -1,4 +1,4 @@
1
- import{r as me,u as fe,E as xe,J as o,q as a,n as t,z as j,t as u,T as d,s as q,d as p,a4 as C,a0 as M,a5 as ee,R as r,p as S,h as te,L as se,$ as ge,o as oe,l as le,K as n,m as ye,a6 as ae}from"./index-Bu8BI3Ga.js";import{b as z,c as J,d as be,a as ke}from"./api-CSt4Y_SE.js";import{P as ne}from"./plus-BWduphxA.js";import{S as he}from"./search-Y6VQntGe.js";import{P as _e}from"./pencil-92uBAIoQ.js";import{S as we}from"./save-sgq5DeZs.js";import{X as Ce}from"./x-TC2ojICC.js";import{T as Se}from"./trash-2-C6yGK69f.js";/**
1
+ import{r as me,u as fe,E as xe,J as o,q as a,n as t,z as j,t as u,T as d,s as q,d as p,a4 as C,a0 as M,a5 as ee,R as r,p as S,h as te,L as se,$ as ge,o as oe,l as le,K as n,m as ye,a6 as ae}from"./index-DCJUYZtV.js";import{b as z,c as J,d as be,a as ke}from"./api-BiDVwQrs.js";import{P as ne}from"./plus-gmwiZVfr.js";import{S as he}from"./search-BabUvoGD.js";import{P as _e}from"./pencil-D4Zz_t0y.js";import{S as we}from"./save-BvtAs5WB.js";import{X as Ce}from"./x-xgLSmc9e.js";import{T as Se}from"./trash-2-C21cNLJl.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{r as A,u as J,a2 as F,E as z,y as E,G,J as s,q as o,n as t,t as p,T as c,A as B,z as _,R as i,j as O,s as h,p as v,o as I,d as C,L as D,l as R,K as m,m as H,a3 as U,D as X,X as Z,N as K,U as Q}from"./index-Bu8BI3Ga.js";import{b as P,e as W,c as V,a as Y}from"./api-CSt4Y_SE.js";import{g as ee}from"./squad-colors-B8B_Y-lz.js";import{X as te}from"./x-TC2ojICC.js";import{G as se}from"./git-branch-DaWa7Suo.js";import{T as oe}from"./trash-2-C6yGK69f.js";import{A as re}from"./arrow-left-r91jNdw5.js";/**
1
+ import{r as A,u as J,a2 as F,E as z,y as E,G,J as s,q as o,n as t,t as p,T as c,A as B,z as _,R as i,j as O,s as h,p as v,o as I,d as C,L as D,l as R,K as m,m as H,a3 as U,D as X,X as Z,N as K,U as Q}from"./index-DCJUYZtV.js";import{b as P,e as W,c as V,a as Y}from"./api-BiDVwQrs.js";import{g as ee}from"./squad-colors-B8B_Y-lz.js";import{X as te}from"./x-xgLSmc9e.js";import{G as se}from"./git-branch-BLstr_Gr.js";import{T as oe}from"./trash-2-C21cNLJl.js";import{A as re}from"./arrow-left-DFbf2tii.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 L}from"./api-CSt4Y_SE.js";import{r as I,u as T,E as B,J as o,q as n,n as t,t as u,T as l,A as M,s as g,k as _,d as f,L as y,K as v,m as N,z as k,a3 as P,R as a,o as x,p,c as b,N as V}from"./index-Bu8BI3Ga.js";import{T as w}from"./triangle-alert-ARN9gQNZ.js";import{G as $}from"./git-branch-DaWa7Suo.js";/**
1
+ import{b as L}from"./api-BiDVwQrs.js";import{r as I,u as T,E as B,J as o,q as n,n as t,t as u,T as l,A as M,s as g,k as _,d as f,L as y,K as v,m as N,z as k,a3 as P,R as a,o as x,p,c as b,N as V}from"./index-DCJUYZtV.js";import{T as w}from"./triangle-alert-BrzY_E1n.js";import{G as $}from"./git-branch-BLstr_Gr.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 y}from"./api-CSt4Y_SE.js";import{g as v}from"./squad-colors-B8B_Y-lz.js";import{r as h,u as k,E as b,J as o,q as r,n as t,t as i,T as l,k as w,d as L,L as C,K as d,o as S,a3 as N,D as f,N as q,R as n,s as _,p as B}from"./index-Bu8BI3Ga.js";import{G as V}from"./git-branch-DaWa7Suo.js";/**
1
+ import{b as y}from"./api-BiDVwQrs.js";import{g as v}from"./squad-colors-B8B_Y-lz.js";import{r as h,u as k,E as b,J as o,q as r,n as t,t as i,T as l,k as w,d as L,L as C,K as d,o as S,a3 as N,D as f,N as q,R as n,s as _,p as B}from"./index-DCJUYZtV.js";import{G as V}from"./git-branch-BLstr_Gr.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{u as t,J as s,q as r,z as l,n as d}from"./index-Bu8BI3Ga.js";const u=["aria-label","aria-checked","disabled"],m=t({__name:"ToggleSwitch",props:{modelValue:{type:Boolean},ariaLabel:{default:"Toggle"},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(e,{emit:o}){const a=e,i=o;function n(){a.disabled||i("update:modelValue",!a.modelValue)}return(c,b)=>(s(),r("button",{type:"button",role:"switch","aria-label":e.ariaLabel,"aria-checked":e.modelValue,disabled:e.disabled,class:l(["inline-flex h-6 w-10 shrink-0 items-center rounded-full border border-border p-0.5 transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",e.modelValue?"bg-gradient-brand shadow-[0_0_0_1px_rgba(228,58,156,0.35)]":"bg-muted"]),onClick:n},[d("span",{class:l(["pointer-events-none h-4 w-4 rounded-full bg-white shadow-sm ring-1 ring-black/10 transition-transform duration-200",e.modelValue?"translate-x-5":"translate-x-0"])},null,2)],10,u))}});export{m as _};
1
+ import{u as t,J as s,q as r,z as l,n as d}from"./index-DCJUYZtV.js";const u=["aria-label","aria-checked","disabled"],m=t({__name:"ToggleSwitch",props:{modelValue:{type:Boolean},ariaLabel:{default:"Toggle"},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(e,{emit:o}){const a=e,i=o;function n(){a.disabled||i("update:modelValue",!a.modelValue)}return(c,b)=>(s(),r("button",{type:"button",role:"switch","aria-label":e.ariaLabel,"aria-checked":e.modelValue,disabled:e.disabled,class:l(["inline-flex h-6 w-10 shrink-0 items-center rounded-full border border-border p-0.5 transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",e.modelValue?"bg-gradient-brand shadow-[0_0_0_1px_rgba(228,58,156,0.35)]":"bg-muted"]),onClick:n},[d("span",{class:l(["pointer-events-none h-4 w-4 rounded-full bg-white shadow-sm ring-1 ring-black/10 transition-transform duration-200",e.modelValue?"translate-x-5":"translate-x-0"])},null,2)],10,u))}});export{m as _};
@@ -1,4 +1,4 @@
1
- import{r as L,u as j,E as Q,J as d,q as r,n as t,t as _,T as k,C as W,d as i,L as m,s as w,R as o,k as X,p as u,a4 as F,a0 as O,K as a,z as Y,D as Z,m as tt}from"./index-Bu8BI3Ga.js";import{b as T,d as q}from"./api-CSt4Y_SE.js";import{T as et}from"./triangle-alert-ARN9gQNZ.js";/**
1
+ import{r as L,u as j,E as Q,J as d,q as r,n as t,t as _,T as k,C as W,d as i,L as m,s as w,R as o,k as X,p as u,a4 as F,a0 as O,K as a,z as Y,D as Z,m as tt}from"./index-DCJUYZtV.js";import{b as T,d as q}from"./api-BiDVwQrs.js";import{T as et}from"./triangle-alert-BrzY_E1n.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{r as j,u as se,a2 as oe,J as o,q as a,d as b,L as K,m as A,n as t,o as I,T as d,a as ce,t as v,F as ve,R as N,D as pe,z,a6 as fe,p as B,K as c,E as me,B as H,s as S,a4 as V,a0 as L,a5 as R,l as Z}from"./index-Bu8BI3Ga.js";import{b as T,d as E,a as G}from"./api-CSt4Y_SE.js";import{S as xe}from"./search-Y6VQntGe.js";import{P as J}from"./plus-BWduphxA.js";import{P as O}from"./pencil-92uBAIoQ.js";import{T as X}from"./trash-2-C6yGK69f.js";import{S as Y}from"./save-sgq5DeZs.js";import{X as ee}from"./x-TC2ojICC.js";/**
1
+ import{r as j,u as se,a2 as oe,J as o,q as a,d as b,L as K,m as A,n as t,o as I,T as d,a as ce,t as v,F as ve,R as N,D as pe,z,a6 as fe,p as B,K as c,E as me,B as H,s as S,a4 as V,a0 as L,a5 as R,l as Z}from"./index-DCJUYZtV.js";import{b as T,d as E,a as G}from"./api-BiDVwQrs.js";import{S as xe}from"./search-BabUvoGD.js";import{P as J}from"./plus-gmwiZVfr.js";import{P as O}from"./pencil-D4Zz_t0y.js";import{T as X}from"./trash-2-C21cNLJl.js";import{S as Y}from"./save-BvtAs5WB.js";import{X as ee}from"./x-xgLSmc9e.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{V as i,O as c}from"./index-Bu8BI3Ga.js";const o="/api";function u(t){try{return JSON.parse(atob(t.split(".")[1])).exp*1e3<=Date.now()+6e4}catch{return!0}}async function n(){const t=i(),e={"Content-Type":"application/json"};return t.token&&u(t.token)&&await t.refreshToken(),t.token&&(e.Authorization=`Bearer ${t.token}`),e}async function s(t,e){if(t.status===401){const r=i();try{if(await r.refreshToken(),r.token){const a=await e();if(a.status===401)throw r.logout(),c.push("/login"),new Error("Session expired");return a}}catch{}throw r.logout(),c.push("/login"),new Error("Session expired")}return t}async function w(t){const e=await s(await fetch(`${o}${t}`,{headers:await n()}),async()=>fetch(`${o}${t}`,{headers:await n()}));if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}async function f(t,e){const r={method:"POST",headers:await n(),body:e?JSON.stringify(e):void 0},a=await s(await fetch(`${o}${t}`,r),async()=>fetch(`${o}${t}`,{...r,headers:await n()}));if(!a.ok)throw new Error(`API error: ${a.status}`);return a.json()}async function $(t,e){const r={method:"PUT",headers:await n(),body:e?JSON.stringify(e):void 0},a=await s(await fetch(`${o}${t}`,r),async()=>fetch(`${o}${t}`,{...r,headers:await n()}));if(!a.ok)throw new Error(`API error: ${a.status}`);return a.json()}async function d(t){const e={method:"DELETE",headers:await n()},r=await s(await fetch(`${o}${t}`,e),async()=>fetch(`${o}${t}`,{...e,headers:await n()}));if(!r.ok)throw new Error(`API error: ${r.status}`);return r.json()}function p(){const t=i(),e=`${o}/stream?token=${t.token??""}`;return new EventSource(e)}export{d as a,w as b,f as c,$ as d,p as e};
1
+ import{V as i,O as c}from"./index-DCJUYZtV.js";const o="/api";function u(t){try{return JSON.parse(atob(t.split(".")[1])).exp*1e3<=Date.now()+6e4}catch{return!0}}async function n(){const t=i(),e={"Content-Type":"application/json"};return t.token&&u(t.token)&&await t.refreshToken(),t.token&&(e.Authorization=`Bearer ${t.token}`),e}async function s(t,e){if(t.status===401){const r=i();try{if(await r.refreshToken(),r.token){const a=await e();if(a.status===401)throw r.logout(),c.push("/login"),new Error("Session expired");return a}}catch{}throw r.logout(),c.push("/login"),new Error("Session expired")}return t}async function w(t){const e=await s(await fetch(`${o}${t}`,{headers:await n()}),async()=>fetch(`${o}${t}`,{headers:await n()}));if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}async function f(t,e){const r={method:"POST",headers:await n(),body:e?JSON.stringify(e):void 0},a=await s(await fetch(`${o}${t}`,r),async()=>fetch(`${o}${t}`,{...r,headers:await n()}));if(!a.ok)throw new Error(`API error: ${a.status}`);return a.json()}async function $(t,e){const r={method:"PUT",headers:await n(),body:e?JSON.stringify(e):void 0},a=await s(await fetch(`${o}${t}`,r),async()=>fetch(`${o}${t}`,{...r,headers:await n()}));if(!a.ok)throw new Error(`API error: ${a.status}`);return a.json()}async function d(t){const e={method:"DELETE",headers:await n()},r=await s(await fetch(`${o}${t}`,e),async()=>fetch(`${o}${t}`,{...e,headers:await n()}));if(!r.ok)throw new Error(`API error: ${r.status}`);return r.json()}function p(){const t=i(),e=`${o}/stream?token=${t.token??""}`;return new EventSource(e)}export{d as a,w as b,f as c,$ as d,p as e};
@@ -1,4 +1,4 @@
1
- import{r}from"./index-Bu8BI3Ga.js";/**
1
+ import{r}from"./index-DCJUYZtV.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{r as c}from"./index-Bu8BI3Ga.js";/**
1
+ import{r as c}from"./index-DCJUYZtV.js";/**
2
2
  * @license lucide-vue-next v0.474.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.