heyio 0.42.0 → 1.0.0
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.
- package/README.md +40 -52
- package/dist/api/auth.js +35 -38
- package/dist/api/server.js +157 -1139
- package/dist/config.js +49 -32
- package/dist/copilot/agents.js +72 -1055
- package/dist/copilot/client.js +6 -17
- package/dist/copilot/io-scheduler.js +55 -139
- package/dist/copilot/model-router.js +100 -72
- package/dist/copilot/orchestrator.js +91 -515
- package/dist/copilot/scheduler.js +67 -189
- package/dist/copilot/skills.js +41 -366
- package/dist/copilot/system-message.js +40 -200
- package/dist/copilot/tools.js +191 -2042
- package/dist/daemon.js +54 -201
- package/dist/index.js +15 -133
- package/dist/mcp/config.js +23 -31
- package/dist/mcp/index.js +2 -3
- package/dist/mcp/registry.js +33 -88
- package/dist/notify.js +18 -100
- package/dist/paths.js +13 -24
- package/dist/setup.js +35 -0
- package/dist/store/db.js +111 -297
- package/dist/store/feed.js +29 -97
- package/dist/store/instances.js +56 -121
- package/dist/store/schedules.js +21 -73
- package/dist/store/squads.js +35 -186
- package/dist/store/tasks.js +25 -168
- package/dist/telegram/bot.js +20 -312
- package/dist/telegram/handlers.js +39 -3
- package/dist/watchdog.js +31 -45
- package/dist/wiki/fs.js +38 -155
- package/dist/wiki/search.js +31 -44
- package/package.json +5 -8
- package/web-dist/assets/ChatView-EFFiln1H.js +11 -0
- package/web-dist/assets/FeedView-bN4NMOL7.js +6 -0
- package/web-dist/assets/LoginView-CNtasq3n.js +1 -0
- package/web-dist/assets/McpView-C2CHiwsi.js +1 -0
- package/web-dist/assets/SchedulesView-CyilLban.js +1 -0
- package/web-dist/assets/SettingsView-1wLXKEF4.js +1 -0
- package/web-dist/assets/SkillsView-BLsD-0u0.js +1 -0
- package/web-dist/assets/SquadDetailView-CsCw2ZLp.js +21 -0
- package/web-dist/assets/SquadsView-DQ3vFlyO.js +6 -0
- package/web-dist/assets/WikiView-19M3oqnq.js +21 -0
- package/web-dist/assets/api-WGvTsXaE.js +1 -0
- package/web-dist/assets/index-D7M5O-_l.css +1 -0
- package/web-dist/assets/index-DZOS9syn.js +95 -0
- package/web-dist/assets/plus-BOvyX1BC.js +6 -0
- package/web-dist/assets/trash-2-DHoetkC4.js +6 -0
- package/web-dist/favicon.svg +4 -1
- package/web-dist/index.html +7 -10
- package/dist/api/logout.test.js +0 -129
- package/dist/api/mcp.test.js +0 -285
- package/dist/api/wiki.test.js +0 -283
- package/dist/auth/session-logic.js +0 -79
- package/dist/auth/session-logic.test.js +0 -201
- package/dist/copilot/auto-complete-instance.test.js +0 -104
- package/dist/copilot/cron.js +0 -136
- package/dist/copilot/event-summary.js +0 -286
- package/dist/copilot/instance-deactivate.test.js +0 -119
- package/dist/copilot/model-router.test.js +0 -71
- package/dist/copilot/review-backfill.js +0 -57
- package/dist/copilot/session-timeout.js +0 -112
- package/dist/copilot/session-timeout.test.js +0 -372
- package/dist/copilot/skills.test.js +0 -55
- package/dist/copilot/universes.js +0 -469
- package/dist/instance-watchdog.js +0 -104
- package/dist/instance-watchdog.test.js +0 -183
- package/dist/mcp/client.js +0 -109
- package/dist/mcp/client.test.js +0 -99
- package/dist/mcp/config.test.js +0 -49
- package/dist/mcp/registry.test.js +0 -79
- package/dist/notify.test.js +0 -232
- package/dist/store/feed.test.js +0 -279
- package/dist/store/instances.test.js +0 -310
- package/dist/store/io-schedules.js +0 -63
- package/dist/store/notifications.js +0 -79
- package/dist/store/notifications.test.js +0 -197
- package/dist/store/schedule-runs.js +0 -46
- package/dist/store/squads.test.js +0 -405
- package/dist/store/tasks.test.js +0 -150
- package/dist/store/worktrees.js +0 -83
- package/dist/tui/index.js +0 -286
- package/dist/update.js +0 -81
- package/dist/watchdog.test.js +0 -83
- package/dist/wiki/wiki-squad.test.js +0 -54
- package/web-dist/assets/AgentActivityView-CedxxE6K.js +0 -1
- package/web-dist/assets/ChatView-DMkYQo_V.js +0 -4
- package/web-dist/assets/FeedView-BH4q-31V.js +0 -1
- package/web-dist/assets/InboxView-BVwVP4EW.js +0 -1
- package/web-dist/assets/LoginView-DRPDhnwu.js +0 -1
- package/web-dist/assets/McpView-D8yWz-lq.js +0 -1
- package/web-dist/assets/SchedulesView-BzzyncGF.js +0 -1
- package/web-dist/assets/SettingsTabs.vue_vue_type_script_setup_true_lang-oW3ySu7Y.js +0 -1
- package/web-dist/assets/SkillsView-oxpYuhx7.js +0 -1
- package/web-dist/assets/SquadsView-CaKUIKlq.js +0 -1
- package/web-dist/assets/StatusIndicator.vue_vue_type_script_setup_true_lang-8U15Qp_Q.js +0 -1
- package/web-dist/assets/WikiView-C5jXUlfW.js +0 -1
- package/web-dist/assets/index-BrWzNw-N.css +0 -10
- package/web-dist/assets/index-f67odrrt.js +0 -81
- package/web-dist/icons.svg +0 -24
package/dist/wiki/search.js
CHANGED
|
@@ -1,49 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { PATHS } from "../paths.js";
|
|
4
|
+
export async function searchPages(query) {
|
|
5
|
+
if (!existsSync(PATHS.wikiPages))
|
|
4
6
|
return [];
|
|
5
|
-
const lowerQuery = query.toLowerCase();
|
|
6
|
-
const pages = listPages();
|
|
7
7
|
const results = [];
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
8
|
+
const lower = query.toLowerCase();
|
|
9
|
+
const walk = (dir, prefix) => {
|
|
10
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
11
|
+
for (const entry of entries) {
|
|
12
|
+
const fullPath = join(dir, entry.name);
|
|
13
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
14
|
+
if (entry.isDirectory()) {
|
|
15
|
+
walk(fullPath, rel);
|
|
16
|
+
}
|
|
17
|
+
else if (entry.name.endsWith(".md")) {
|
|
18
|
+
const content = readFileSync(fullPath, "utf-8");
|
|
19
|
+
const lines = content.split("\n");
|
|
20
|
+
for (let i = 0; i < lines.length; i++) {
|
|
21
|
+
if (lines[i].toLowerCase().includes(lower)) {
|
|
22
|
+
results.push({
|
|
23
|
+
path: rel,
|
|
24
|
+
snippet: lines[i].trim().slice(0, 120),
|
|
25
|
+
line: i + 1,
|
|
26
|
+
});
|
|
27
|
+
break; // one result per file
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
walk(PATHS.wikiPages, "");
|
|
26
34
|
return results;
|
|
27
35
|
}
|
|
28
|
-
export function getWikiSummary() {
|
|
29
|
-
const pages = listPages();
|
|
30
|
-
if (pages.length === 0)
|
|
31
|
-
return "Wiki is empty — no pages yet.";
|
|
32
|
-
const lines = ["Wiki pages:"];
|
|
33
|
-
for (const pagePath of pages) {
|
|
34
|
-
const content = readPage(pagePath);
|
|
35
|
-
const title = content ? extractTitle(pagePath, content) : pagePath;
|
|
36
|
-
lines.push(`- ${pagePath}: ${title}`);
|
|
37
|
-
}
|
|
38
|
-
return lines.join("\n");
|
|
39
|
-
}
|
|
40
|
-
function extractTitle(pagePath, content) {
|
|
41
|
-
const firstLine = content.split("\n").find((l) => l.trim().length > 0);
|
|
42
|
-
if (firstLine) {
|
|
43
|
-
const heading = firstLine.replace(/^#+\s*/, "").trim();
|
|
44
|
-
if (heading)
|
|
45
|
-
return heading;
|
|
46
|
-
}
|
|
47
|
-
return pagePath.replace(/.*\//, "").replace(/\.md$/, "");
|
|
48
|
-
}
|
|
49
36
|
//# sourceMappingURL=search.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "heyio",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "IO — a personal AI assistant built on the GitHub Copilot SDK",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "IO — a personal AI assistant daemon built on the GitHub Copilot SDK",
|
|
5
5
|
"bin": {
|
|
6
6
|
"io": "dist/index.js"
|
|
7
7
|
},
|
|
@@ -16,10 +16,9 @@
|
|
|
16
16
|
"build:all": "npm run build && npm run build:web",
|
|
17
17
|
"postinstall": "npm rebuild better-sqlite3",
|
|
18
18
|
"daemon": "tsx src/daemon.ts",
|
|
19
|
-
"tui": "tsx src/tui/index.ts",
|
|
20
19
|
"dev": "tsx --watch src/daemon.ts",
|
|
21
20
|
"prepublishOnly": "npm run build:all",
|
|
22
|
-
"test": "node --import tsx --test 'src/**/*.test.ts'
|
|
21
|
+
"test": "node --import tsx --test 'src/**/*.test.ts'"
|
|
23
22
|
},
|
|
24
23
|
"engines": {
|
|
25
24
|
"node": ">=22"
|
|
@@ -45,7 +44,6 @@
|
|
|
45
44
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
46
45
|
"better-sqlite3": "^12.6.2",
|
|
47
46
|
"commander": "^14.0.0",
|
|
48
|
-
"dotenv": "^17.3.1",
|
|
49
47
|
"express": "^5.2.1",
|
|
50
48
|
"grammy": "^1.40.0",
|
|
51
49
|
"zod": "^4.3.6"
|
|
@@ -53,9 +51,8 @@
|
|
|
53
51
|
"devDependencies": {
|
|
54
52
|
"@types/better-sqlite3": "^7.6.13",
|
|
55
53
|
"@types/express": "^5.0.6",
|
|
56
|
-
"@types/node": "^
|
|
54
|
+
"@types/node": "^22.15.0",
|
|
57
55
|
"tsx": "^4.21.0",
|
|
58
|
-
"typescript": "^5.
|
|
59
|
-
"vue-tsc": "^3.2.9"
|
|
56
|
+
"typescript": "^5.8.0"
|
|
60
57
|
}
|
|
61
58
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
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";/**
|
|
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 I=v("SendIcon",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/**
|
|
7
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const T=v("SquareIcon",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),U=h("chat",()=>{const r=u([]),n=u(!1),o=u(null);function l(t){const e={id:crypto.randomUUID(),role:"user",content:t,timestamp:new Date};return r.value.push(e),e}async function m(t){l(t),n.value=!0;const e={id:crypto.randomUUID(),role:"assistant",content:"",timestamp:new Date,streaming:!0};r.value.push(e);try{const s=await D("/message",{prompt:t});e.content=s.content,e.streaming=!1}catch(s){e.content=`Error: ${s.message}`,e.streaming=!1}finally{n.value=!1}}function f(t){const e=r.value[r.value.length-1];e!=null&&e.streaming&&(e.content=t)}function p(){r.value=[]}return{messages:r,isStreaming:n,eventSource:o,sendMessage:m,updateStreamingMessage:f,clearMessages:p}}),j={class:"flex flex-col h-full"},B={key:0,class:"flex items-center justify-center h-full"},z=["innerHTML"],L={key:0,class:"inline-block w-2 h-4 bg-current animate-pulse ml-1"},V={class:"border-t border-border p-4"},E={class:"flex gap-2 items-end"},H=["disabled"],F=b({__name:"ChatView",setup(r){const n=U(),o=u(""),l=u();async function m(){const t=o.value.trim();!t||n.isStreaming||(o.value="",await n.sendMessage(t),await C(),f())}function f(){l.value&&(l.value.scrollTop=l.value.scrollHeight)}function p(t){t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),m())}return k(()=>f()),(t,e)=>(i(),d("div",j,[a("div",{ref_key:"messagesContainer",ref:l,class:"flex-1 overflow-y-auto p-4 space-y-4"},[c(n).messages.length===0?(i(),d("div",B,[...e[1]||(e[1]=[a("div",{class:"text-center text-muted-foreground"},[a("div",{class:"text-4xl mb-3"},"🤖"),a("p",{class:"text-lg font-medium"},"Welcome to IO"),a("p",{class:"text-sm mt-1"},"Send a message to get started.")],-1)])])):g("",!0),(i(!0),d(w,null,_(c(n).messages,s=>(i(),d("div",{key:s.id,class:y(["flex",s.role==="user"?"justify-end":"justify-start"])},[a("div",{class:y(["max-w-[75%] rounded-lg px-4 py-2 text-sm",s.role==="user"?"bg-primary text-primary-foreground":"bg-muted text-foreground"])},[a("div",{class:"whitespace-pre-wrap break-words",innerHTML:s.content||"..."},null,8,z),s.streaming?(i(),d("div",L)):g("",!0)],2)],2))),128))],512),a("div",V,[a("div",E,[S(a("textarea",{"onUpdate:modelValue":e[0]||(e[0]=s=>o.value=s),onKeydown:p,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),[[M,o.value]]),a("button",{onClick:m,disabled:!o.value.trim()||c(n).isStreaming,class:"rounded-md bg-primary text-primary-foreground p-2 hover:bg-primary/90 disabled:opacity-50 transition-colors"},[c(n).isStreaming?(i(),x(c(T),{key:1,class:"w-4 h-4"})):(i(),x(c(I),{key:0,class:"w-4 h-4"}))],8,H)])])]))}});export{F as default};
|
|
@@ -0,0 +1,6 @@
|
|
|
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";/**
|
|
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 L=$("CheckIcon",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]),T={class:"p-6"},j={class:"flex items-center justify-between mb-6"},z={class:"flex gap-2"},A=["onClick"],E={key:0,class:"text-muted-foreground"},G={key:1,class:"text-center py-12 text-muted-foreground"},P={key:2,class:"space-y-2"},R=["onClick"],S={class:"flex-1 min-w-0"},U={class:"flex items-center gap-2"},q={class:"text-xs bg-secondary text-secondary-foreground px-2 py-0.5 rounded-full"},H={class:"text-xs text-muted-foreground mt-0.5"},J={class:"flex gap-1"},K=["onClick"],O=["onClick"],Q={key:0,class:"px-4 pb-3 border-t border-border pt-3"},W={class:"prose prose-sm dark:prose-invert max-w-none text-sm whitespace-pre-wrap"},te=I({__name:"FeedView",setup(X){const n=d([]),c=d(0),u=d("all"),p=d(!0),i=d(null);async function x(){p.value=!0;try{const t=await D(`/feed?unread=${u.value==="unread"}`);n.value=t.items,c.value=t.unreadCount}finally{p.value=!1}}async function h(t){await N(`/feed/${t}/read`);const s=n.value.find(e=>e.id===t);s&&(s.read=1,c.value=Math.max(0,c.value-1))}async function C(t){await V(`/feed/${t}`),n.value=n.value.filter(s=>s.id!==t)}function w(t){i.value=i.value===t?null:t,i.value===t&&h(t)}return F(x),(t,s)=>(a(),r("div",T,[o("div",j,[s[0]||(s[0]=o("h1",{class:"text-2xl font-bold"},"Feed",-1)),o("div",z,[(a(),r(b,null,g(["all","unread"],e=>o("button",{key:e,onClick:v=>{u.value=e,x()},class:m(["px-3 py-1.5 text-xs rounded-md border transition-colors",u.value===e?"bg-primary text-primary-foreground border-primary":"border-border text-muted-foreground hover:text-foreground"])},l(e==="all"?"All":`Unread (${c.value})`),11,A)),64))])]),p.value?(a(),r("div",E,"Loading...")):n.value.length===0?(a(),r("div",G,[f(_(M),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),s[1]||(s[1]=o("p",null,"No feed items.",-1))])):(a(),r("div",P,[(a(!0),r(b,null,g(n.value,e=>(a(),r("div",{key:e.id,class:m(["border border-border rounded-lg overflow-hidden",{"border-l-2 border-l-primary":!e.read}])},[o("div",{onClick:v=>w(e.id),class:"flex items-center gap-3 px-4 py-3 cursor-pointer hover:bg-muted/50 transition-colors"},[o("div",S,[o("div",U,[o("span",q,l(e.source),1),o("span",{class:m(["text-sm font-medium truncate",{"font-bold":!e.read}])},l(e.title),3)]),o("p",H,l(e.created_at),1)]),o("div",J,[e.read?k("",!0):(a(),r("button",{key:0,onClick:y(v=>h(e.id),["stop"]),class:"p-1.5 rounded hover:bg-accent text-muted-foreground",title:"Mark as read"},[f(_(L),{class:"w-3.5 h-3.5"})],8,K)),o("button",{onClick:y(v=>C(e.id),["stop"]),class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive",title:"Delete"},[f(_(B),{class:"w-3.5 h-3.5"})],8,O)])],8,R),i.value===e.id?(a(),r("div",Q,[o("div",W,l(e.content),1)])):k("",!0)],2))),128))]))]))}});export{te as default};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +1,21 @@
|
|
|
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";/**
|
|
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 V=m("ArrowLeftIcon",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/**
|
|
7
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const I=m("FlaskConicalIcon",[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2",key:"18mbvz"}],["path",{d:"M6.453 15h11.094",key:"3shlmq"}],["path",{d:"M8.5 2h7",key:"csnxdl"}]]);/**
|
|
12
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const S=m("ShieldIcon",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/**
|
|
17
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const F=m("UserIcon",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]),N={class:"p-6"},z={key:0,class:"text-muted-foreground"},B={class:"mb-6"},R={class:"text-2xl font-bold"},H={class:"text-muted-foreground"},T={class:"mb-8"},D={class:"border border-border rounded-lg overflow-hidden"},U={class:"w-full text-sm"},j={class:"px-4 py-2 font-medium"},E={class:"px-4 py-2 text-muted-foreground"},G={class:"px-4 py-2"},Q={class:"px-4 py-2 flex gap-1"},$={key:0,class:"text-xs bg-primary/10 text-primary px-1.5 py-0.5 rounded"},J={key:1,class:"text-xs bg-blue-500/10 text-blue-500 px-1.5 py-0.5 rounded"},K={key:2,class:"text-xs bg-purple-500/10 text-purple-500 px-1.5 py-0.5 rounded"},O={key:0,class:"mb-8"},P={class:"grid grid-cols-1 md:grid-cols-3 gap-3"},W={class:"font-mono text-xs text-muted-foreground"},X={class:"text-sm font-medium mt-1"},Y={class:"text-xs text-muted-foreground mt-1"},Z={key:0,class:"text-sm text-muted-foreground"},ee={key:1,class:"space-y-2"},te={class:"flex items-center justify-between"},se={class:"text-sm"},ne=w({__name:"SquadDetailView",setup(oe){const v=A(),u=i(null),f=i([]),y=i([]),_=i([]),h=i(!0);return C(async()=>{try{const n=await M(`/squads/${v.params.id}`);u.value=n.squad,f.value=n.agents,y.value=n.tasks,_.value=n.instances}finally{h.value=!1}}),(n,s)=>{const k=L("router-link");return o(),l("div",N,[d(k,{to:"/squads",class:"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-4"},{default:q(()=>[d(p(V),{class:"w-4 h-4"}),s[0]||(s[0]=x(" Back to Squads ",-1))]),_:1}),h.value?(o(),l("div",z,"Loading...")):u.value?(o(),l(c,{key:1},[e("div",B,[e("h1",R,a(u.value.name),1),e("p",H,a(u.value.universe),1)]),e("section",T,[s[5]||(s[5]=e("h2",{class:"text-lg font-semibold mb-3"},"Agent Roster",-1)),e("div",D,[e("table",U,[s[4]||(s[4]=e("thead",{class:"bg-muted"},[e("tr",null,[e("th",{class:"text-left px-4 py-2 font-medium"},"Character"),e("th",{class:"text-left px-4 py-2 font-medium"},"Role"),e("th",{class:"text-left px-4 py-2 font-medium"},"Status"),e("th",{class:"text-left px-4 py-2 font-medium"},"Flags")])],-1)),e("tbody",null,[(o(!0),l(c,null,b(f.value,t=>(o(),l("tr",{key:t.id,class:"border-t border-border"},[e("td",j,a(t.character_name),1),e("td",E,a(t.role_title),1),e("td",G,[e("span",{class:g(["inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full",{"bg-green-500/10 text-green-500":t.status==="idle","bg-yellow-500/10 text-yellow-500":t.status==="working","bg-blue-500/10 text-blue-500":t.status==="reviewing"}])},a(t.status),3)]),e("td",Q,[t.is_lead?(o(),l("span",$,[d(p(F),{class:"w-3 h-3 inline"}),s[1]||(s[1]=x(" Lead ",-1))])):r("",!0),t.is_qa?(o(),l("span",J,[d(p(S),{class:"w-3 h-3 inline"}),s[2]||(s[2]=x(" QA ",-1))])):r("",!0),t.is_test?(o(),l("span",K,[d(p(I),{class:"w-3 h-3 inline"}),s[3]||(s[3]=x(" Test ",-1))])):r("",!0)])]))),128))])])])]),_.value.length>0?(o(),l("section",O,[s[6]||(s[6]=e("h2",{class:"text-lg font-semibold mb-3"},"Active Instances",-1)),e("div",P,[(o(!0),l(c,null,b(_.value,t=>(o(),l("div",{key:t.id,class:"border border-border rounded-lg p-3"},[e("div",W,a(t.id.slice(0,8)),1),e("div",X,a(t.branch),1),e("div",Y,"Last activity: "+a(t.last_activity),1)]))),128))])])):r("",!0),e("section",null,[s[7]||(s[7]=e("h2",{class:"text-lg font-semibold mb-3"},"Recent Tasks",-1)),y.value.length===0?(o(),l("div",Z,"No tasks yet.")):(o(),l("div",ee,[(o(!0),l(c,null,b(y.value,t=>(o(),l("div",{key:t.id,class:"border border-border rounded-lg p-3"},[e("div",te,[e("span",se,a(t.description),1),e("span",{class:g(["text-xs px-2 py-0.5 rounded-full",{"bg-yellow-500/10 text-yellow-500":t.status==="pending","bg-blue-500/10 text-blue-500":t.status==="in_progress","bg-green-500/10 text-green-500":t.status==="done","bg-red-500/10 text-red-500":t.status==="failed"}])},a(t.status),3)])]))),128))]))])],64)):r("",!0)])}}});export{ne as default};
|
|
@@ -0,0 +1,6 @@
|
|
|
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";/**
|
|
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 V=y("GitBranchIcon",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),C={class:"p-6"},S={key:0,class:"text-muted-foreground"},F={key:1,class:"text-center py-12 text-muted-foreground"},G={key:2,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},I={class:"flex items-start justify-between"},L={class:"font-semibold"},j={class:"text-sm text-muted-foreground mt-0.5"},A={class:"text-xs bg-secondary text-secondary-foreground px-2 py-0.5 rounded-full"},M={class:"mt-3 flex items-center gap-4 text-xs text-muted-foreground"},U={key:0,class:"flex items-center gap-1"},T=x({__name:"SquadsView",setup(D){const c=d([]),l=d([]),i=d(!0);f(async()=>{try{const a=await _("/squads");c.value=a.squads,l.value=a.agents}finally{i.value=!1}});function p(a){return l.value.filter(t=>t.squad_id===a)}return(a,t)=>{const g=w("router-link");return o(),r("div",C,[t[2]||(t[2]=e("h1",{class:"text-2xl font-bold mb-6"},"Squads",-1)),i.value?(o(),r("div",S,"Loading...")):c.value.length===0?(o(),r("div",F,[u(m(h),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),t[0]||(t[0]=e("p",null,"No squads yet.",-1)),t[1]||(t[1]=e("p",{class:"text-sm mt-1"},"Ask IO to create a squad for your project.",-1))])):(o(),r("div",G,[(o(!0),r(v,null,k(c.value,s=>(o(),b(g,{key:s.id,to:`/squads/${s.id}`,class:"block rounded-lg border border-border bg-card p-4 hover:border-primary/50 transition-colors"},{default:q(()=>[e("div",I,[e("div",null,[e("h3",L,n(s.name),1),e("p",j,n(s.universe),1)]),e("span",A,n(p(s.id).length)+" agents ",1)]),e("div",M,[s.repo_url?(o(),r("span",U,[u(m(V),{class:"w-3 h-3"}),B(" "+n(s.repo_url),1)])):N("",!0)])]),_:2},1032,["to"]))),128))]))])}}});export{T as default};
|
|
@@ -0,0 +1,21 @@
|
|
|
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";/**
|
|
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 q=h("PencilIcon",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/**
|
|
7
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const E=h("SaveIcon",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/**
|
|
12
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const N=h("SearchIcon",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/**
|
|
17
|
+
* @license lucide-vue-next v0.474.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const T=h("XIcon",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),F={class:"flex h-full"},H={class:"w-64 border-r border-border flex flex-col shrink-0"},U={class:"p-3 border-b border-border"},X={class:"relative"},G={class:"flex-1 overflow-y-auto p-2"},O={key:0,class:"text-xs text-muted-foreground p-2"},Q=["onClick"],W={class:"flex-1 flex flex-col"},A={key:0,class:"flex items-center justify-center h-full text-muted-foreground"},J={class:"text-center"},K={class:"flex items-center justify-between px-4 py-2 border-b border-border"},R={class:"text-sm font-medium font-mono"},Y={class:"flex gap-1"},Z={class:"flex-1 overflow-y-auto p-4"},ee={key:1,class:"prose prose-sm dark:prose-invert max-w-none whitespace-pre-wrap"},le=S({__name:"WikiView",setup(te){const d=r([]),a=r(null),v=r(""),u=r(!1),f=r(""),p=r(""),g=r(!0);V(async()=>{try{d.value=await y("/wiki/pages")}finally{g.value=!1}});async function _(l){a.value=l,u.value=!1;const t=await y(`/wiki/page/${l}`);v.value=t.content}function w(){f.value=v.value,u.value=!0}async function C(){a.value&&(await D(`/wiki/page/${a.value}`,{content:f.value}),v.value=f.value,u.value=!1)}async function M(){a.value&&confirm(`Delete "${a.value}"?`)&&(await I(`/wiki/page/${a.value}`),d.value=d.value.filter(l=>l!==a.value),a.value=null,v.value="")}const P=()=>{if(!p.value)return d.value;const l=p.value.toLowerCase();return d.value.filter(t=>t.toLowerCase().includes(l))};return(l,t)=>(o(),s("div",F,[e("div",H,[e("div",U,[e("div",X,[c(i(N),{class:"absolute left-2.5 top-2.5 w-3.5 h-3.5 text-muted-foreground"}),k(e("input",{"onUpdate:modelValue":t[0]||(t[0]=n=>p.value=n),placeholder:"Search pages...",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),[[b,p.value]])])]),e("div",G,[g.value?(o(),s("div",O,"Loading...")):z("",!0),(o(!0),s(m,null,L(P(),n=>(o(),s("button",{key:n,onClick:ae=>_(n),class:B(["w-full text-left px-2 py-1.5 text-xs rounded hover:bg-accent truncate transition-colors",{"bg-accent font-medium":a.value===n}])}," 📄 "+x(n),11,Q))),128))])]),e("div",W,[a.value?(o(),s(m,{key:1},[e("div",K,[e("span",R,x(a.value),1),e("div",Y,[u.value?(o(),s(m,{key:1},[e("button",{onClick:C,class:"p-1.5 rounded hover:bg-accent text-green-500",title:"Save"},[c(i(E),{class:"w-4 h-4"})]),e("button",{onClick:t[1]||(t[1]=n=>u.value=!1),class:"p-1.5 rounded hover:bg-accent text-muted-foreground",title:"Cancel"},[c(i(T),{class:"w-4 h-4"})])],64)):(o(),s(m,{key:0},[e("button",{onClick:w,class:"p-1.5 rounded hover:bg-accent text-muted-foreground",title:"Edit"},[c(i(q),{class:"w-4 h-4"})]),e("button",{onClick:M,class:"p-1.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive",title:"Delete"},[c(i(j),{class:"w-4 h-4"})])],64))])]),e("div",Z,[u.value?k((o(),s("textarea",{key:0,"onUpdate:modelValue":t[2]||(t[2]=n=>f.value=n),class:"w-full h-full min-h-[400px] font-mono text-sm bg-background border border-input rounded-md p-3 focus:outline-none focus:ring-1 focus:ring-ring resize-none"},null,512)),[[b,f.value]]):(o(),s("div",ee,x(v.value),1))])],64)):(o(),s("div",A,[e("div",J,[c(i($),{class:"w-12 h-12 mx-auto mb-3 opacity-50"}),t[3]||(t[3]=e("p",null,"Select a page to view",-1))])]))])]))}});export{le as default};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 240 10% 3.9%;--card: 0 0% 100%;--card-foreground: 240 10% 3.9%;--primary: 240 5.9% 10%;--primary-foreground: 0 0% 98%;--secondary: 240 4.8% 95.9%;--secondary-foreground: 240 5.9% 10%;--muted: 240 4.8% 95.9%;--muted-foreground: 240 3.8% 46.1%;--accent: 240 4.8% 95.9%;--accent-foreground: 240 5.9% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--border: 240 5.9% 90%;--input: 240 5.9% 90%;--ring: 240 5.9% 10%;--radius: .5rem}.dark{--background: 240 10% 3.9%;--foreground: 0 0% 98%;--card: 240 10% 3.9%;--card-foreground: 0 0% 98%;--primary: 0 0% 98%;--primary-foreground: 240 5.9% 10%;--secondary: 240 3.7% 15.9%;--secondary-foreground: 0 0% 98%;--muted: 240 3.7% 15.9%;--muted-foreground: 240 5% 64.9%;--accent: 240 3.7% 15.9%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 98%;--border: 240 3.7% 15.9%;--input: 240 3.7% 15.9%;--ring: 240 4.9% 83.9%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,system-ui,-apple-system,sans-serif}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: rgb(17 24 39 / 10%);--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.absolute{position:absolute}.relative{position:relative}.left-0\.5{left:.125rem}.left-2\.5{left:.625rem}.top-0\.5{top:.125rem}.top-2\.5{top:.625rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-12{height:3rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[120px\]{max-height:120px}.min-h-\[400px\]{min-height:400px}.min-h-\[40px\]{min-height:40px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-64{width:16rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-\[75\%\]{max-width:75%}.max-w-lg{max-width:32rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-transparent{border-color:transparent}.border-l-primary{border-left-color:hsl(var(--primary))}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-card{background-color:hsl(var(--card))}.bg-current{background-color:currentColor}.bg-green-500\/10{background-color:#22c55e1a}.bg-muted{background-color:hsl(var(--muted))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-500\/10{background-color:#ef44441a}.bg-secondary{background-color:hsl(var(--secondary))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/10{background-color:#eab3081a}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-3{padding-bottom:.75rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.tracking-tight{letter-spacing:-.025em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-foreground{color:hsl(var(--foreground))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-50{opacity:.5}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.dark\:prose-invert:is(.dark *){--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
|