promptmic 0.1.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.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +287 -0
  3. package/apps/server/dist/config-store.js +15 -0
  4. package/apps/server/dist/http/local-only-middleware.js +10 -0
  5. package/apps/server/dist/http/routes/config-routes.js +21 -0
  6. package/apps/server/dist/http/routes/filesystem-routes.js +28 -0
  7. package/apps/server/dist/http/routes/system-routes.js +16 -0
  8. package/apps/server/dist/http/static-assets.js +12 -0
  9. package/apps/server/dist/http/types.js +1 -0
  10. package/apps/server/dist/http-routes.js +15 -0
  11. package/apps/server/dist/index.js +54 -0
  12. package/apps/server/dist/main.js +8 -0
  13. package/apps/server/dist/pty-spawner.js +72 -0
  14. package/apps/server/dist/runtime-config.js +108 -0
  15. package/apps/server/dist/server-lifecycle.js +37 -0
  16. package/apps/server/dist/server-types.js +1 -0
  17. package/apps/server/dist/session-runtime.js +120 -0
  18. package/apps/web/dist/assets/DirectoryPickerDialog-D7IDk0pz.js +1 -0
  19. package/apps/web/dist/assets/SettingsDialog-uQLxj7UI.js +1 -0
  20. package/apps/web/dist/assets/index-BBNxXHaX.js +5 -0
  21. package/apps/web/dist/assets/index-G1_MX_Dd.css +1 -0
  22. package/apps/web/dist/assets/react-vendor-DQ3p2tNP.js +40 -0
  23. package/apps/web/dist/assets/scroll-area-C8DJNmaJ.js +1 -0
  24. package/apps/web/dist/assets/terminal-Beg8tuEN.css +32 -0
  25. package/apps/web/dist/assets/terminal-CnuCQtKf.js +9 -0
  26. package/apps/web/dist/assets/ui-vendor-Btc0UVaC.js +155 -0
  27. package/apps/web/dist/index.html +20 -0
  28. package/bin/termspeak-lib.mjs +189 -0
  29. package/bin/termspeak.mjs +9 -0
  30. package/config.example.json +21 -0
  31. package/package.json +70 -0
  32. package/packages/shared/dist/index.d.ts +2 -0
  33. package/packages/shared/dist/index.js +2 -0
  34. package/packages/shared/dist/provider.d.ts +85 -0
  35. package/packages/shared/dist/provider.js +13 -0
  36. package/packages/shared/dist/ws-messages.d.ts +219 -0
  37. package/packages/shared/dist/ws-messages.js +56 -0
@@ -0,0 +1,37 @@
1
+ export async function listenHttpServer(server, port, host) {
2
+ await new Promise((resolve, reject) => {
3
+ const handleError = (error) => {
4
+ server.off('listening', handleListening);
5
+ reject(error);
6
+ };
7
+ const handleListening = () => {
8
+ server.off('error', handleError);
9
+ resolve();
10
+ };
11
+ server.once('error', handleError);
12
+ server.once('listening', handleListening);
13
+ server.listen(port, host);
14
+ });
15
+ }
16
+ export function getListeningPort(server, fallbackPort) {
17
+ const address = server.address();
18
+ return typeof address === 'object' && address ? address.port : fallbackPort;
19
+ }
20
+ export async function closeServerRuntime(options) {
21
+ options.beforeClose?.();
22
+ await new Promise((resolve, reject) => {
23
+ options.wss.close((wsError) => {
24
+ if (wsError) {
25
+ reject(wsError);
26
+ return;
27
+ }
28
+ options.server.close((serverError) => {
29
+ if (serverError) {
30
+ reject(serverError);
31
+ return;
32
+ }
33
+ resolve();
34
+ });
35
+ });
36
+ });
37
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,120 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { wsCommandSchema } from '../../../packages/shared/dist/index.js';
4
+ const SOCKET_OPEN = 1;
5
+ function defaultParseMessage(raw) {
6
+ return wsCommandSchema.parse(JSON.parse(raw));
7
+ }
8
+ function isSocketOpen(socket) {
9
+ return socket.readyState === SOCKET_OPEN;
10
+ }
11
+ function sendEvent(socket, event) {
12
+ if (!isSocketOpen(socket))
13
+ return;
14
+ socket.send(JSON.stringify(event));
15
+ }
16
+ function normalizeRawMessage(raw) {
17
+ if (typeof raw === 'string')
18
+ return raw;
19
+ if (raw instanceof Uint8Array)
20
+ return Buffer.from(raw).toString('utf-8');
21
+ if (raw && typeof raw === 'object' && 'toString' in raw && typeof raw.toString === 'function') {
22
+ return raw.toString();
23
+ }
24
+ return String(raw);
25
+ }
26
+ export function createSessionRuntime(options) {
27
+ const sessions = new Map();
28
+ const createSessionId = options.createSessionId ?? randomUUID;
29
+ const parseMessage = options.parseMessage ?? defaultParseMessage;
30
+ const isLoopbackAddress = options.isLoopbackAddress ?? (() => true);
31
+ const isAllowedOrigin = options.isAllowedOrigin ?? (() => true);
32
+ const stopSession = (sessionId) => {
33
+ const session = sessions.get(sessionId);
34
+ if (!session)
35
+ return;
36
+ session.pty.kill();
37
+ sessions.delete(sessionId);
38
+ };
39
+ const closeAll = () => {
40
+ for (const session of sessions.values()) {
41
+ session.pty.kill();
42
+ }
43
+ sessions.clear();
44
+ };
45
+ const handleConnection = (socket, request) => {
46
+ if (options.localOnly &&
47
+ (!isLoopbackAddress(request.socket.remoteAddress) || !isAllowedOrigin(request.headers.origin))) {
48
+ socket.close(1008, 'Local access only');
49
+ return;
50
+ }
51
+ const socketSessionIds = new Set();
52
+ const startSession = (provider, cwd) => {
53
+ const config = options.getConfig();
54
+ if (!(provider in config.providers)) {
55
+ sendEvent(socket, { type: 'error', message: `Unknown provider: "${provider}"` });
56
+ return;
57
+ }
58
+ const sessionId = createSessionId();
59
+ const effectiveCwd = cwd ? path.resolve(cwd) : options.defaultCwd;
60
+ const pty = options.spawnPty({ provider, cwd: effectiveCwd, config });
61
+ sessions.set(sessionId, { pty });
62
+ socketSessionIds.add(sessionId);
63
+ pty.onData((data) => {
64
+ sendEvent(socket, { type: 'output', sessionId, data });
65
+ });
66
+ pty.onExit(({ exitCode, signal }) => {
67
+ sessions.delete(sessionId);
68
+ socketSessionIds.delete(sessionId);
69
+ sendEvent(socket, { type: 'session_exit', sessionId, exitCode, signal: signal ?? 0 });
70
+ });
71
+ sendEvent(socket, {
72
+ type: 'session_started',
73
+ sessionId,
74
+ provider,
75
+ cwd: effectiveCwd,
76
+ });
77
+ };
78
+ socket.on('message', (raw) => {
79
+ try {
80
+ const payload = parseMessage(normalizeRawMessage(raw));
81
+ if (payload.type === 'start_session') {
82
+ startSession(payload.provider, payload.cwd);
83
+ return;
84
+ }
85
+ if (payload.type === 'input') {
86
+ const session = sessions.get(payload.sessionId);
87
+ if (!session) {
88
+ sendEvent(socket, { type: 'error', message: 'Session not found.' });
89
+ return;
90
+ }
91
+ session.pty.write(payload.data);
92
+ return;
93
+ }
94
+ if (payload.type === 'resize') {
95
+ const session = sessions.get(payload.sessionId);
96
+ if (!session)
97
+ return;
98
+ session.pty.resize(payload.cols, payload.rows);
99
+ return;
100
+ }
101
+ if (payload.type === 'stop_session') {
102
+ stopSession(payload.sessionId);
103
+ }
104
+ }
105
+ catch (error) {
106
+ const message = error instanceof Error ? error.message : 'Invalid message.';
107
+ sendEvent(socket, { type: 'error', message });
108
+ }
109
+ });
110
+ socket.on('close', () => {
111
+ for (const sessionId of socketSessionIds) {
112
+ stopSession(sessionId);
113
+ }
114
+ });
115
+ };
116
+ return {
117
+ handleConnection,
118
+ closeAll,
119
+ };
120
+ }
@@ -0,0 +1 @@
1
+ import{j as e}from"./react-vendor-DQ3p2tNP.js";import{u as E,p as R,c as m,B as a}from"./index-BBNxXHaX.js";import{D as A,a as H,b as L,c as O,I as v,S as Q,d as T}from"./scroll-area-C8DJNmaJ.js";import{q,r as y,s as x,u as K}from"./ui-vendor-Btc0UVaC.js";import"./terminal-CnuCQtKf.js";function V(N){const{messages:t}=E(),{pickerOpen:b,browsePath:o,browseParent:w,cwd:k,searchQuery:p,setSearchQuery:C,pickerLoading:r,pickerError:h,pathInput:c,setPathInput:D,filteredDirectories:d,favoriteDirs:u,recentDirs:g,isBrowsePathFavorite:n,loadDirectories:i,closePicker:f,openCurrentFolder:F,openHomeFolder:z,openParentFolder:P,selectCurrentFolder:S,toggleFavorite:I,directories:j}=N;return e.jsx(A,{open:b,onOpenChange:s=>{s||f()},children:e.jsxs(H,{className:"max-w-2xl gap-0 p-0",children:[e.jsxs("div",{className:"space-y-3 border-b px-6 pb-4 pt-6",children:[e.jsx(L,{className:"p-0",children:e.jsx(O,{className:"text-xl",children:t.directory.title})}),e.jsx("p",{className:"text-base leading-relaxed text-muted-foreground",children:t.directory.description}),e.jsx("nav",{className:"flex flex-wrap items-center gap-0.5 rounded-md bg-muted/50 px-2.5 py-2.5 font-mono text-sm","aria-label":t.directory.pathAriaLabel,children:o?R(o).map((s,l,B)=>e.jsxs("span",{className:"flex items-center gap-0.5",children:[l>0&&e.jsx(q,{className:"h-3.5 w-3.5 text-muted-foreground/40"}),e.jsx("button",{className:m("rounded px-1 py-0.5 transition-colors hover:bg-accent hover:text-accent-foreground",l===B.length-1?"font-medium text-foreground":"text-muted-foreground"),onClick:()=>{i(s.path)},disabled:r,children:s.label})]},s.path)):e.jsx("span",{className:"text-muted-foreground",children:t.directory.loading})})]}),e.jsxs("div",{className:"space-y-4 border-b px-6 py-4",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{variant:"secondary",size:"sm",className:"h-9 text-sm",onClick:z,disabled:r,children:t.directory.home}),e.jsx(a,{variant:"secondary",size:"sm",className:"h-9 text-sm",onClick:P,disabled:!w||r,children:t.directory.up}),e.jsx(a,{variant:"secondary",size:"sm",className:"h-9 text-sm",onClick:F,disabled:!k||r,children:t.directory.currentFolder})]}),u.length>0&&e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:[e.jsx(y,{className:"h-3.5 w-3.5"}),t.directory.favorites]}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:u.map(s=>e.jsx(a,{variant:"secondary",size:"sm",className:"h-8 text-sm",title:s.path,onClick:()=>{i(s.path)},disabled:r,children:s.label},s.path))})]}),g.length>0&&e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:[e.jsx(x,{className:"h-3.5 w-3.5"}),t.directory.recent]}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:g.map(s=>e.jsx(a,{variant:"secondary",size:"sm",className:"h-8 text-sm",title:s.path,onClick:()=>{i(s.path)},disabled:r,children:s.label},s.path))})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(v,{value:c,onChange:s=>D(s.target.value),onKeyDown:s=>{if(s.key==="Enter"){s.preventDefault();const l=c.trim();l&&i(l)}},placeholder:t.directory.goToPath,className:"h-10 font-mono text-sm"}),e.jsx(a,{variant:"secondary",size:"sm",className:"h-10 px-4 text-sm",onClick:()=>{const s=c.trim();s&&i(s)},disabled:!c.trim()||r,children:t.directory.openPath}),e.jsx(a,{variant:"ghost",size:"icon",className:m("h-9 w-9 shrink-0",n?"text-yellow-500 hover:text-yellow-400":"text-muted-foreground hover:text-yellow-500"),onClick:I,disabled:!o||r,title:n?t.directory.removeFavorite:t.directory.addFavorite,children:e.jsx(y,{className:m("h-4 w-4",n&&"fill-current")})})]})]}),e.jsxs("div",{className:"space-y-3 px-6 py-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:[e.jsx(x,{className:"h-3.5 w-3.5"}),t.directory.subfolders]}),e.jsxs("span",{className:"text-xs tabular-nums text-muted-foreground",children:[d.length,p.trim()?` / ${j.length}`:""]})]}),e.jsxs("div",{className:"relative",children:[e.jsx(K,{className:"pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground/60"}),e.jsx(v,{value:p,onChange:s=>C(s.target.value),placeholder:t.directory.filter,className:"h-10 pl-9 text-sm"})]}),h&&e.jsx("p",{className:"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-base text-destructive-foreground",children:h}),e.jsx(Q,{className:"h-[260px] rounded-md border",children:e.jsxs("div",{className:"grid gap-1 p-2","aria-busy":r,children:[d.map(s=>e.jsxs("button",{className:"flex items-center gap-2 rounded-md px-3 py-2.5 text-left font-mono text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",onClick:()=>{i(s.path)},disabled:r,children:[e.jsx(x,{className:"h-4 w-4 shrink-0"}),s.name]},s.path)),!r&&d.length===0&&e.jsx("p",{className:"py-8 text-center text-base text-muted-foreground",children:j.length===0?t.directory.noSubfolders:t.directory.noResults})]})})]}),e.jsxs(T,{className:"border-t px-6 py-4",children:[e.jsx(a,{variant:"outline",size:"sm",className:"h-10 px-4 text-sm",onClick:f,children:t.directory.cancel}),e.jsx(a,{size:"sm",className:"h-10 px-4 text-sm",onClick:S,disabled:!o||r,children:t.directory.selectFolder})]})]})})}export{V as DirectoryPickerDialog};
@@ -0,0 +1 @@
1
+ import{r as v,j as e}from"./react-vendor-DQ3p2tNP.js";import{v as X,X as q,w as V,a as S}from"./ui-vendor-Btc0UVaC.js";import{s as G,t as D,a as Q,u as U,B as f,c as H,S as T,b as z,d as I,e as O,f as P}from"./index-BBNxXHaX.js";import{D as W,a as Y,b as Z,c as ee,S as se,I as k,d as te}from"./scroll-area-C8DJNmaJ.js";import"./terminal-CnuCQtKf.js";const _=c=>({_key:c,label:"",executionMode:"direct",command:"",env:[]}),ae=(c,i)=>Object.entries(c.providers??{}).map(([,r])=>({_key:i(),label:r.label,executionMode:r.executionMode,command:G(r.command,r.args),env:Object.entries(r.env).map(([t,d])=>({key:t,value:d}))})),le=c=>c.length>0&&c.every(i=>i.label.trim()&&i.command.trim()),ne=(c,i)=>{const r=new Set,t=c.map(m=>{let x=D(m.label);for(;r.has(x);)x=`${x}-${r.size}`;r.add(x);const j={};for(const p of m.env){const u=p.key.trim();u&&(j[u]=p.value)}const{command:y,args:N}=Q(m.command.trim());return[x,{label:m.label.trim(),executionMode:m.executionMode,command:y,args:N,env:j}]}),d=Object.fromEntries(t),o=Object.keys(d),b=i&&o.includes(i)?i:void 0;return{providers:d,...b?{defaultProvider:b}:{}}};function me({open:c,onOpenChange:i,onSaved:r}){const{messages:t}=U(),[d,o]=v.useState([]),[b,m]=v.useState(""),[x,j]=v.useState(!1),[y,N]=v.useState(!1),p=v.useRef(0),u=()=>p.current++;v.useEffect(()=>{c&&(N(!0),fetch("/api/config").then(s=>s.json()).then(s=>{const a=ae(s,u);o(a.length>0?a:[_(u())]),m(s.defaultProvider??"")}).catch(()=>{o([_(u())]),m("")}).finally(()=>N(!1)))},[c]);const F=()=>{o(s=>[...s,_(u())])},K=s=>{o(a=>a.filter(l=>l._key!==s))},w=(s,a,l)=>{o(n=>n.map(h=>h._key===s?{...h,[a]:l}:h))},A=(s,a)=>{o(l=>l.map(n=>n._key===s?{...n,executionMode:a}:n))},B=s=>{o(a=>a.map(l=>l._key===s?{...l,env:[...l.env,{key:"",value:""}]}:l))},C=(s,a,l,n)=>{o(h=>h.map(g=>{if(g._key!==s)return g;const $=g.env.map((E,J)=>J===a?{...E,[l]:n}:E);return{...g,env:$}}))},L=(s,a)=>{o(l=>l.map(n=>n._key!==s?n:{...n,env:n.env.filter((h,g)=>g!==a)}))},M=le(d),R=async()=>{if(M){j(!0);try{const s=ne(d,b);if(!(await fetch("/api/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).ok){S.error(t.settings.saveError);return}S.success(t.settings.saveSuccess),i(!1),r()}catch{S.error(t.settings.saveError)}finally{j(!1)}}};return e.jsx(W,{open:c,onOpenChange:i,children:e.jsxs(Y,{className:"max-w-2xl gap-0 p-0",children:[e.jsxs("div",{className:"border-b px-6 pt-6 pb-4",children:[e.jsx(Z,{className:"p-0",children:e.jsx(ee,{className:"text-xl sm:text-2xl",children:t.settings.title})}),e.jsx("p",{className:"mt-3 max-w-3xl text-base leading-relaxed text-muted-foreground",children:t.settings.description})]}),e.jsx(se,{className:"max-h-[68vh]",children:e.jsxs("div",{className:"space-y-5 px-6 py-5",children:[y&&e.jsx("p",{className:"text-base text-muted-foreground",children:t.settings.loading}),d.map(s=>e.jsxs("div",{className:"space-y-4 rounded-xl border p-5",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("code",{className:"text-base text-muted-foreground",children:D(s.label)}),e.jsxs(f,{variant:"destructive",size:"sm",className:"h-9 gap-1.5 px-3 text-sm",onClick:()=>K(s._key),children:[e.jsx(X,{className:"h-3.5 w-3.5"}),t.settings.remove]})]}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-2 block text-base font-medium text-foreground",children:t.settings.name}),e.jsx(k,{value:s.label,onChange:a=>w(s._key,"label",a.target.value),placeholder:t.settings.namePlaceholder,className:H("h-11 text-base",!s.label.trim()&&"border-destructive")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-2 block text-base font-medium text-foreground",children:t.settings.executionMode}),e.jsxs(T,{value:s.executionMode,onValueChange:a=>A(s._key,a),children:[e.jsx(z,{className:"h-11 w-full text-base",children:e.jsx(I,{})}),e.jsxs(O,{children:[e.jsx(P,{value:"direct",children:t.settings.executionModeDirect}),e.jsx(P,{value:"shell",children:t.settings.executionModeShell})]})]}),e.jsx("p",{className:"mt-2 text-sm leading-relaxed text-muted-foreground",children:s.executionMode==="direct"?t.settings.executionModeDirectHint:t.settings.executionModeShellHint})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-2 block text-base font-medium text-foreground",children:t.settings.command}),e.jsx(k,{value:s.command,onChange:a=>w(s._key,"command",a.target.value),placeholder:s.executionMode==="direct"?t.settings.commandDirectPlaceholder:t.settings.commandShellPlaceholder,className:H("h-11 font-mono text-base",!s.command.trim()&&"border-destructive")}),e.jsx("p",{className:"mt-2 text-sm leading-relaxed text-muted-foreground",children:s.executionMode==="direct"?t.settings.commandDirectHint:t.settings.commandShellHint})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("label",{className:"block text-base font-medium text-foreground",children:t.settings.envVars}),e.jsx("p",{className:"text-sm leading-relaxed text-muted-foreground",children:t.settings.envVarsHint}),s.env.map((a,l)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{value:a.key,onChange:n=>C(s._key,l,"key",n.target.value),placeholder:t.settings.envKeyPlaceholder,className:"h-11 w-[45%] font-mono text-base"}),e.jsx("span",{className:"text-base text-muted-foreground",children:"="}),e.jsx(k,{value:a.value,onChange:n=>C(s._key,l,"value",n.target.value),placeholder:t.settings.envValuePlaceholder,className:"h-11 flex-1 font-mono text-base"}),e.jsx(f,{variant:"ghost",size:"icon",className:"h-10 w-10 shrink-0 text-muted-foreground",onClick:()=>L(s._key,l),children:e.jsx(q,{className:"h-4 w-4"})})]},l)),e.jsxs(f,{variant:"secondary",size:"sm",className:"h-10 text-sm",onClick:()=>B(s._key),children:[e.jsx(V,{className:"mr-1.5 h-4 w-4"}),t.settings.addVariable]})]})]})]},s._key)),e.jsxs(f,{variant:"secondary",onClick:F,className:"h-11 w-full border border-dashed border-border text-base",children:[e.jsx(V,{className:"mr-2 h-4.5 w-4.5"}),t.settings.addAssistant]}),d.length>1&&e.jsxs("div",{children:[e.jsx("label",{className:"mb-2 block text-base font-medium text-foreground",children:t.settings.defaultProvider}),e.jsxs(T,{value:b,onValueChange:m,children:[e.jsx(z,{className:"h-11 w-full text-base",children:e.jsx(I,{placeholder:t.settings.selectPlaceholder})}),e.jsx(O,{children:d.map(s=>{const a=D(s.label);return e.jsx(P,{value:a,children:s.label||a},s._key)})})]})]})]})}),e.jsxs(te,{className:"border-t px-6 py-4",children:[e.jsx(f,{variant:"ghost",className:"h-11 px-5 text-base",onClick:()=>i(!1),children:t.settings.cancel}),e.jsx(f,{variant:"default",className:"h-11 px-5 text-base",onClick:R,disabled:!M||x,children:x?t.settings.saving:t.settings.save})]})]})})}export{me as SettingsDialog};
@@ -0,0 +1,5 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/terminal-CnuCQtKf.js","assets/react-vendor-DQ3p2tNP.js","assets/terminal-Beg8tuEN.css","assets/DirectoryPickerDialog-D7IDk0pz.js","assets/scroll-area-C8DJNmaJ.js","assets/ui-vendor-Btc0UVaC.js","assets/SettingsDialog-uQLxj7UI.js"])))=>i.map(i=>d[i]);
2
+ import{r as o,j as t,d as ke,R as Pe}from"./react-vendor-DQ3p2tNP.js";import{t as Re,c as Ie,a as T,S as Le,b as de,d as Fe,e as Te,M as De,T as ue,I as He,C as me,f as fe,g as _e,h as pe,P as Ae,i as ge,V as Me,L as he,j as xe,k as ze,l as Be,m as Ue,n as ve,R as Ve,o as Oe,F as $e,p as qe}from"./ui-vendor-Btc0UVaC.js";import"./terminal-CnuCQtKf.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))i(c);new MutationObserver(c=>{for(const u of c)if(u.type==="childList")for(const m of u.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&i(m)}).observe(document,{childList:!0,subtree:!0});function r(c){const u={};return c.integrity&&(u.integrity=c.integrity),c.referrerPolicy&&(u.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?u.credentials="include":c.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function i(c){if(c.ep)return;c.ep=!0;const u=r(c);fetch(c.href,u)}})();const Ke="modulepreload",We=function(e){return"/"+e},oe={},G=function(s,r,i){let c=Promise.resolve();if(r&&r.length>0){let m=function(h){return Promise.all(h.map(l=>Promise.resolve(l).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),x=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));c=m(r.map(h=>{if(h=We(h),h in oe)return;oe[h]=!0;const l=h.endsWith(".css"),d=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${d}`))return;const n=document.createElement("link");if(n.rel=l?"stylesheet":Ke,l||(n.as="script"),n.crossOrigin="",n.href=h,x&&n.setAttribute("nonce",x),document.head.appendChild(n),l)return new Promise((g,f)=>{n.addEventListener("load",g),n.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${h}`)))})}))}function u(m){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=m,window.dispatchEvent(a),!a.defaultPrevented)throw m}return c.then(m=>{for(const a of m||[])a.status==="rejected"&&u(a.reason);return s().catch(u)})};function j(...e){return Re(Ie(e))}const Ge={en:{app:{sessionStartedTerminal:"Session started",sessionStartedToast:"Session started.",sessionClosedTerminal:"Terminal closed. Start a new session to begin from scratch.",sessionClosedToast:"Session ended. Start a new session to continue.",errorLabel:"error",terminalIdleTitle:"TermSpeak terminal",speechUnsupported:"Your browser does not support the Web Speech API. Use Chrome or Edge for the MVP."},connection:{active:"Active session",ready:"Ready",connecting:"Connecting..."},steps:{assistant:"1. Assistant",folder:"2. Folder",session:"3. Session"},toolbar:{settings:"Settings",lightMode:"Light mode",darkMode:"Dark mode",subtitle:"Voice-first local UI for terminal-based coding assistants.",serverUnavailable:"Server unavailable. Run `npm run dev` to start it."},controls:{assistant:"Assistant",configureAssistants:"Configure assistants",configureAssistantsHint:"Add your first assistant in Settings.",assistantReadyHint:"Choose which assistant to use in this session.",interfaceLanguage:"Interface",dictationLanguage:"Dictation",fontSize:"Text size",folder:"Project folder",noFolder:"None",selectedFolder:"Selected folder",noFolderSelected:"No folder selected",chooseFolder:"Choose folder",chooseFolderHint:"Choose the folder where the assistant should work.",waitingConnection:"Waiting for connection...",startSession:"Start session",endSession:"End session",startHintNeedsAssistant:"First, add an assistant.",startHintNeedsFolder:"Now choose a project folder.",startHintReady:"Everything is ready. Start the session.",english:"English",portuguese:"Portuguese (Brazil)",fontSmall:"Small",fontMedium:"Medium",fontLarge:"Large"},prompt:{quickFlowTitle:"Quick flow",quickFlowDescription:"1. Configure an assistant if you have not added one yet. 2. Choose the project folder. 3. Start the session. 4. Dictate or type prompts after the terminal connects.",stopDictation:"Stop dictation",dictatePrompt:"Dictate prompt",placeholder:"Say what you need, review the text, and press Enter...",send:"Send",shortcuts:"Enter sends · Shift+Enter adds a line break · Ctrl+K focuses · Arrow keys browse history",pushToTalkHint:e=>`Hold ${e} to talk`},settings:{title:"Configure assistants",description:"If you normally type `codex`, `claude`, or `aider` in the terminal, choose Normal command. If you use your own shortcut such as `personal` or `work`, choose Shell shortcut.",loading:"Loading...",remove:"Remove",name:"Name",namePlaceholder:"e.g. Claude Code CLI",executionMode:"Execution mode",executionModeDirect:"Normal command (`codex`)",executionModeShell:"Shell shortcut (`personal`)",executionModeDirectHint:"Use this when the command already works normally in your terminal.",executionModeShellHint:"Use this when the command is your own shell shortcut, alias, or function.",command:"What you type in the terminal",commandPlaceholder:"e.g. claude, codex, aider --no-auto-commits",commandDirectPlaceholder:"e.g. codex, claude, aider --no-auto-commits",commandShellPlaceholder:"e.g. personal, work, source-env && claude",commandDirectHint:"Examples: `codex`, `claude`, `aider --no-auto-commits`.",commandShellHint:"Examples: `personal`, `work`.",envVars:"Environment variables (optional)",envVarsHint:"Use this only if the assistant needs extra values when it starts. Example: `CLAUDE_CONFIG_DIR=~/.claude-work`.",envKeyPlaceholder:"KEY",envValuePlaceholder:"value",addVariable:"Add variable",addAssistant:"Add assistant",defaultProvider:"Default provider",selectPlaceholder:"Select...",cancel:"Cancel",saving:"Saving...",save:"Save",saveError:"Could not save configuration.",saveSuccess:"Configuration saved."},directory:{title:"Select directory",description:"Choose the folder where the assistant should run.",pathAriaLabel:"Path",favorites:"Favorites",recent:"Recent",goToPath:"Go to path... (Enter)",openPath:"Open",home:"Home",up:"Up",currentFolder:"Current folder",removeFavorite:"Remove from favorites",addFavorite:"Add to favorites",subfolders:"Subfolders",filter:"Filter...",loading:"Loading...",noSubfolders:"No subfolders.",noResults:"No results.",cancel:"Cancel",selectFolder:"Select this folder",folderSelected:"Folder selected.",favoriteRemoved:"Favorite removed.",favoriteAdded:"Favorite added.",maxFavorites:e=>`Maximum of ${e} favorites.`,openDirectoryError:"Could not open directory.",homeLabel:"Home"},speech:{captureError:"Voice capture failed."},terminal:{title:"TermSpeak Terminal",helper:"Choose an assistant, select a folder, and start the session.",processClosed:"process exited"}},"pt-BR":{app:{sessionStartedTerminal:"Sessão iniciada",sessionStartedToast:"Sessão iniciada.",sessionClosedTerminal:"Terminal fechado. Inicie uma nova sessão para começar do zero.",sessionClosedToast:"Sessão encerrada. Inicie uma nova sessão para continuar.",errorLabel:"erro",terminalIdleTitle:"terminal do TermSpeak",speechUnsupported:"Seu navegador não suporta Web Speech API. Use Chrome ou Edge para o MVP."},connection:{active:"Sessão ativa",ready:"Pronto",connecting:"Conectando..."},steps:{assistant:"1. Assistente",folder:"2. Pasta",session:"3. Sessão"},toolbar:{settings:"Configurações",lightMode:"Modo claro",darkMode:"Modo escuro",subtitle:"Interface local com voz para assistentes de código baseados em terminal.",serverUnavailable:"Servidor indisponível. Execute `npm run dev` para iniciar."},controls:{assistant:"Assistente",configureAssistants:"Configurar assistentes",configureAssistantsHint:"Adicione seu primeiro assistente em Configurações.",assistantReadyHint:"Escolha qual assistente usar nesta sessão.",interfaceLanguage:"Interface",dictationLanguage:"Ditado",fontSize:"Tamanho do texto",folder:"Pasta do projeto",noFolder:"Nenhuma",selectedFolder:"Pasta selecionada",noFolderSelected:"Nenhuma pasta selecionada",chooseFolder:"Escolher pasta",chooseFolderHint:"Escolha a pasta onde o assistente deve trabalhar.",waitingConnection:"Aguardando conexão...",startSession:"Iniciar sessão",endSession:"Encerrar sessão",startHintNeedsAssistant:"Primeiro, adicione um assistente.",startHintNeedsFolder:"Agora escolha a pasta do projeto.",startHintReady:"Tudo pronto. Inicie a sessão.",english:"Inglês",portuguese:"Português (Brasil)",fontSmall:"Pequeno",fontMedium:"Médio",fontLarge:"Grande"},prompt:{quickFlowTitle:"Fluxo rápido",quickFlowDescription:"1. Configure um assistente se ainda não existir nenhum. 2. Escolha a pasta do projeto. 3. Inicie a sessão. 4. Depois dite ou digite seus prompts quando o terminal conectar.",stopDictation:"Parar ditado",dictatePrompt:"Ditar prompt",placeholder:"Diga seu pedido, revise o texto e pressione Enter...",send:"Enviar",shortcuts:"Enter envia · Shift+Enter quebra linha · Ctrl+K foca · Setas navegam no histórico",pushToTalkHint:e=>`Segure ${e} para falar`},settings:{title:"Configurar assistentes",description:"Se você normalmente digita `codex`, `claude` ou `aider` no terminal, escolha Comando normal. Se você usa um atalho seu, como `personal` ou `work`, escolha Atalho do shell.",loading:"Carregando...",remove:"Remover",name:"Nome",namePlaceholder:"Ex.: Claude Code CLI",executionMode:"Modo de execução",executionModeDirect:"Comando normal (`codex`)",executionModeShell:"Atalho do shell (`personal`)",executionModeDirectHint:"Use quando o comando já funciona normalmente no seu terminal.",executionModeShellHint:"Use quando o comando é um atalho, alias ou função do seu shell.",command:"O que você digita no terminal",commandPlaceholder:"Ex.: claude, codex, aider --no-auto-commits",commandDirectPlaceholder:"Ex.: codex, claude, aider --no-auto-commits",commandShellPlaceholder:"Ex.: personal, work, source-env && claude",commandDirectHint:"Exemplos: `codex`, `claude`, `aider --no-auto-commits`.",commandShellHint:"Exemplos: `personal`, `work`.",envVars:"Variáveis de ambiente (opcional)",envVarsHint:"Use isso só se o assistente precisar de valores extras ao iniciar. Exemplo: `CLAUDE_CONFIG_DIR=~/.claude-work`.",envKeyPlaceholder:"CHAVE",envValuePlaceholder:"valor",addVariable:"Adicionar variável",addAssistant:"Adicionar assistente",defaultProvider:"Provider padrão",selectPlaceholder:"Selecionar...",cancel:"Cancelar",saving:"Salvando...",save:"Salvar",saveError:"Erro ao salvar configuração.",saveSuccess:"Configuração salva."},directory:{title:"Selecionar diretório",description:"Escolha a pasta onde o assistente deve rodar.",pathAriaLabel:"Caminho",favorites:"Favoritos",recent:"Recentes",goToPath:"Ir para caminho... (Enter)",openPath:"Abrir",home:"Home",up:"Acima",currentFolder:"Pasta atual",removeFavorite:"Remover dos favoritos",addFavorite:"Adicionar aos favoritos",subfolders:"Subpastas",filter:"Filtrar...",loading:"Carregando...",noSubfolders:"Nenhuma subpasta.",noResults:"Nenhum resultado.",cancel:"Cancelar",selectFolder:"Selecionar esta pasta",folderSelected:"Pasta selecionada.",favoriteRemoved:"Favorito removido.",favoriteAdded:"Favorito adicionado.",maxFavorites:e=>`Máximo de ${e} favoritos.`,openDirectoryError:"Falha ao abrir diretório.",homeLabel:"Home"},speech:{captureError:"Falha ao capturar voz."},terminal:{title:"Terminal TermSpeak",helper:"Escolha um assistente, selecione uma pasta e inicie a sessão.",processClosed:"processo encerrado"}}},be=o.createContext(null);function Je(e){return e==="pt-BR"?"pt-BR":"en"}function ne(){return(typeof navigator>"u"?[]:[navigator.language,...navigator.languages??[]]).some(s=>s==null?void 0:s.toLowerCase().startsWith("pt"))?"pt-BR":"en"}function Ye({language:e,children:s}){return o.useEffect(()=>{document.documentElement.lang=e},[e]),t.jsx(be.Provider,{value:{language:e,messages:Ge[e]},children:s})}function z(){const e=o.useContext(be);if(!e)throw new Error("useI18n must be used within I18nProvider");return e}const E={speechLang:"voice-control.speech-lang",uiLanguage:"voice-control.ui-language",fontSize:"voice-control.font-size",preferences:"voice-control.preferences",promptHistory:"voice-control.prompt-history",dirUsage:"voice-control.dir-usage",favorites:"voice-control.favorites",theme:"voice-control.theme"},ae=30,Qe=80,se=6,M=(e,s)=>{try{const r=window.localStorage.getItem(e);return r?JSON.parse(r):s}catch{return s}},J=(e,s)=>{window.localStorage.setItem(e,JSON.stringify(s))},Xe=e=>!e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).filter(s=>typeof s[0]=="string"&&typeof s[1]=="number"&&Number.isFinite(s[1])&&s[1]>0)),ie=e=>Object.fromEntries(Object.entries(e).sort((s,r)=>r[1]-s[1]).slice(0,Qe)),ce=(e,s,r="Home")=>s&&e===s?r:e.split("/").filter(Boolean).at(-1)??e,yt=e=>{const s=e.split("/").filter(Boolean),r=[{label:"/",path:"/"}];for(let i=0;i<s.length;i++)r.push({label:s[i],path:"/"+s.slice(0,i+1).join("/")});return r},jt=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,30)||"provider",Nt=(e,s)=>[e,...s].map(r=>r.length===0?"''":/^[A-Za-z0-9_./:@%+=,-]+$/.test(r)?r:`'${r.replace(/'/g,"'\\''")}'`).join(" ");function Ct(e){const s=[];let r="",i="plain",c=!1;const u=()=>{r.length>0&&(s.push(r),r="")};for(let m=0;m<e.length;m+=1){const a=e[m];if(c){r+=a,c=!1;continue}if(i==="single"){a==="'"?i="plain":r+=a;continue}if(i==="double"){if(a==='"')i="plain";else if(a==="\\"){const x=e[m+1];x&&["\\",'"',"$","`"].includes(x)?(r+=x,m+=1):r+=a}else r+=a;continue}if(/\s/.test(a)){u();continue}if(a==="\\"){c=!0;continue}if(a==="'"){i="single";continue}if(a==='"'){i="double";continue}r+=a}if(c&&(r+="\\"),u(),i!=="plain")throw new Error("Unterminated quoted string.");return{command:s[0]??"",args:s.slice(1)}}function Ze(){const[e,s]=o.useState(()=>{const p=window.localStorage.getItem(E.theme);if(p==="light"||p==="dark"){const w=p==="dark";return document.documentElement.classList.toggle("dark",w),w}return document.documentElement.classList.contains("dark")}),r=()=>{s(p=>{const w=!p;return document.documentElement.classList.toggle("dark",w),window.localStorage.setItem(E.theme,w?"dark":"light"),w})},[i,c]=o.useState(()=>{const p=window.localStorage.getItem(E.speechLang);return p==="en-US"||p==="pt-BR"?p:ne()==="pt-BR"?"pt-BR":"en-US"}),[u,m]=o.useState(()=>{const p=window.localStorage.getItem(E.uiLanguage);if(p)return Je(p);const w=M(E.preferences,{});return w.uiLanguage?w.uiLanguage:ne()}),[a,x]=o.useState(()=>{const p=window.localStorage.getItem(E.fontSize);if(p==="sm"||p==="md"||p==="lg")return p;const w=M(E.preferences,{});return w.fontSize==="sm"||w.fontSize==="md"||w.fontSize==="lg"?w.fontSize:"md"}),[h,l]=o.useState(()=>M(E.preferences,{}).provider??""),[d,n]=o.useState(()=>M(E.preferences,{}).cwd??""),[g,f]=o.useState("");return o.useEffect(()=>{window.localStorage.setItem(E.speechLang,i)},[i]),o.useEffect(()=>{window.localStorage.setItem(E.uiLanguage,u)},[u]),o.useEffect(()=>{window.localStorage.setItem(E.fontSize,a),document.body.dataset.fontSize=a,document.documentElement.dataset.fontSize=a},[a]),o.useEffect(()=>{J(E.preferences,{provider:h,cwd:d.trim(),uiLanguage:u,fontSize:a})},[d,h,u,a]),{darkMode:e,toggleTheme:r,uiLanguage:u,setUiLanguage:m,fontSize:a,setFontSize:x,speechLang:i,setSpeechLang:c,provider:h,setProvider:l,cwd:d,setCwd:n,homeDir:g,setHomeDir:f}}function et(e){const[s,r]=o.useState("connecting"),[i,c]=o.useState(null),u=o.useRef(null),m=o.useRef(null),a=o.useRef(e);a.current=e,o.useEffect(()=>{m.current=i},[i]);const x=o.useCallback(h=>{const l=u.current;!l||l.readyState!==WebSocket.OPEN||l.send(JSON.stringify(h))},[]);return o.useEffect(()=>{const h=window.location.protocol==="https:"?"wss":"ws",l=new WebSocket(`${h}://${window.location.host}/ws`);return u.current=l,l.onopen=()=>{r("connected")},l.onclose=()=>{r("disconnected"),c(null)},l.onmessage=d=>{const n=JSON.parse(d.data);n.type==="session_started"&&(c(n.sessionId),a.current.onSessionStarted(n)),n.type==="output"&&a.current.onOutput(n),n.type==="session_exit"&&(c(null),a.current.onSessionExit(n)),n.type==="error"&&a.current.onError(n)},()=>{l.close()}},[]),{status:s,sessionId:i,setSessionId:c,sessionIdRef:m,sendWs:x}}function tt({sendWs:e,sessionIdRef:s,sessionId:r,fontSize:i}){const{messages:c}=z(),u=o.useRef(null),m=o.useRef(i),a=o.useRef(null),x=o.useRef(null),h=()=>{const l=x.current;l&&(l.reset(),l.writeln(`\x1B[1m ${c.terminal.title} \x1B[0m`),l.writeln(`\x1B[2m ${c.terminal.helper}\x1B[0m`),l.writeln(""))};return m.current=i,o.useEffect(()=>{if(!u.current)return;let l=!1,d;return(async()=>{const[{Terminal:n},{FitAddon:g}]=await Promise.all([G(()=>import("./terminal-CnuCQtKf.js").then(C=>C.x),__vite__mapDeps([0,1,2])),G(()=>import("./terminal-CnuCQtKf.js").then(C=>C.a),__vite__mapDeps([0,1,2]))]);if(l||!u.current)return;const f=new n({cursorBlink:!0,fontFamily:'"JetBrains Mono", monospace',fontSize:m.current,lineHeight:1.35,theme:{background:"#0a0a0a",foreground:"#fafafa",cursor:"#fafafa",cursorAccent:"#0a0a0a",selectionBackground:"rgba(250, 250, 250, 0.15)",black:"#0a0a0a",red:"#ff7b72",green:"#3fb950",yellow:"#d29922",blue:"#58a6ff",magenta:"#bc8cff",cyan:"#39d2e0",white:"#fafafa",brightBlack:"#484f58",brightRed:"#ffa198",brightGreen:"#56d364",brightYellow:"#e3b341",brightBlue:"#79c0ff",brightMagenta:"#d2a8ff",brightCyan:"#56d4dd",brightWhite:"#f0f6fc"}}),p=new g;f.loadAddon(p),f.open(u.current),p.fit(),a.current=p,x.current=f,h();const w=()=>{p.fit();const C=s.current;C&&e({type:"resize",sessionId:C,cols:f.cols,rows:f.rows})},P=f.onData(C=>{const v=s.current;v&&e({type:"input",sessionId:v,data:C})});window.addEventListener("resize",w),d=()=>{window.removeEventListener("resize",w),P.dispose(),a.current=null,x.current=null,f.dispose()}})(),()=>{l=!0,d==null||d()}},[e,s]),o.useEffect(()=>{r||h()},[c.terminal.helper,c.terminal.title,r]),o.useEffect(()=>{var n;const l=x.current;if(!l)return;l.options.fontSize=i,(n=a.current)==null||n.fit(),l.refresh(0,l.rows-1);const d=s.current;d&&e({type:"resize",sessionId:d,cols:l.cols,rows:l.rows})},[i,e,s]),{terminalRef:x,containerRef:u}}function st({speechLang:e,onTranscript:s}){const{messages:r}=z(),[i,c]=o.useState(!1),u=o.useRef(!1),m=o.useRef(""),a=o.useRef(null),x=o.useRef(s);x.current=s;const h=o.useMemo(()=>typeof window<"u"&&!!(window.SpeechRecognition||window.webkitSpeechRecognition),[]);o.useEffect(()=>{u.current=i},[i]),o.useEffect(()=>{a.current&&(a.current.lang=e)},[e]),o.useEffect(()=>{if(!h)return;const g=window.SpeechRecognition||window.webkitSpeechRecognition,f=new g;return f.lang=e,f.interimResults=!0,f.continuous=!0,f.onresult=p=>{var C,v;let w="";for(let D=p.resultIndex;D<p.results.length;D+=1){const k=p.results[D],A=((v=(C=k[0])==null?void 0:C.transcript)==null?void 0:v.trim())??"";A&&(k.isFinal?m.current=`${m.current} ${A}`.trim():w=`${w} ${A}`.trim())}const P=`${m.current} ${w}`.trim();x.current(P)},f.onend=()=>{if(u.current){f.start();return}c(!1)},f.onerror=p=>{if(u.current&&(p.error==="aborted"||p.error==="no-speech")){f.start();return}c(!1),T.error(r.speech.captureError)},a.current=f,()=>{f.stop()}},[r.speech.captureError,h,e]);const l=()=>{const g=a.current;if(g&&!u.current){m.current="";try{g.start(),c(!0)}catch{}}},d=()=>{const g=a.current;g&&u.current&&(g.stop(),c(!1))};return{isListening:i,startVoice:l,stopVoice:d,toggleVoice:()=>{if(u.current){d();return}l()},speechSupported:h,dictatedFinalRef:m}}function rt({sendWs:e,sessionId:s}){const[r,i]=o.useState(""),[c,u]=o.useState(()=>M(E.promptHistory,[])),[m,a]=o.useState(null),x=o.useRef(null);return o.useEffect(()=>{J(E.promptHistory,c.slice(0,ae))},[c]),o.useEffect(()=>{const d=x.current;if(!d)return;d.style.height="0px";const n=Math.min(d.scrollHeight,200);d.style.height=`${n}px`,d.scrollTop=d.scrollHeight},[r]),o.useEffect(()=>{var d;s&&((d=x.current)==null||d.focus())},[s]),o.useEffect(()=>{const d=n=>{var g;(n.ctrlKey||n.metaKey)&&n.key.toLowerCase()==="k"&&(n.preventDefault(),(g=x.current)==null||g.focus())};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[]),{promptDraft:r,setPromptDraft:i,sendPrompt:()=>{const d=r.trim();!s||!d||(e({type:"input",sessionId:s,data:d}),u(n=>[d,...n.filter(g=>g!==d)].slice(0,ae)),a(null),i(""),T.success("Prompt enviado."))},navigateHistory:d=>{if(c.length!==0){if(d==="older"){a(n=>{const g=n===null?0:Math.min(n+1,c.length-1),f=c[g];return f&&i(f),g});return}a(n=>{if(n===null)return null;const g=n-1;if(g<0)return i(""),null;const f=c[g];return f&&i(f),g})}},promptTextareaRef:x,promptHistory:c,promptHistoryIndex:m,setPromptHistoryIndex:a}}function ot({cwd:e,setCwd:s,homeDir:r}){const{messages:i}=z(),[c,u]=o.useState(()=>Xe(M(E.dirUsage,{}))),[m,a]=o.useState(()=>M(E.favorites,[])),[x,h]=o.useState(!1),[l,d]=o.useState(""),[n,g]=o.useState(null),[f,p]=o.useState([]),[w,P]=o.useState(""),[C,v]=o.useState(!1),[D,k]=o.useState(""),[A,B]=o.useState("");o.useEffect(()=>{J(E.dirUsage,ie(c))},[c]),o.useEffect(()=>{J(E.favorites,m)},[m]),o.useEffect(()=>{B(l)},[l]);const Q=o.useMemo(()=>{const y=w.trim().toLowerCase();return y?f.filter(R=>R.name.toLowerCase().includes(y)):f},[f,w]),X=o.useMemo(()=>m.slice(0,se).map(y=>({label:ce(y,r,i.directory.homeLabel),path:y})),[m,r,i.directory.homeLabel]),Z=o.useMemo(()=>Object.entries(c).sort((y,R)=>R[1]-y[1]).map(([y])=>y).filter(y=>y!==e&&!m.includes(y)).slice(0,5).map(y=>({label:ce(y,r,i.directory.homeLabel),path:y})),[e,c,m,r,i.directory.homeLabel]),ee=o.useMemo(()=>!!l&&m.includes(l),[l,m]),U=(y,R=1)=>{const F=y.trim();F&&u(q=>{const Ee={...q,[F]:(q[F]??0)+R};return ie(Ee)})},b=async y=>{v(!0),k(""),P("");try{const R=await fetch(`/api/fs/list?path=${encodeURIComponent(y)}`);if(!R.ok){const q=await R.json();throw new Error(q.error||i.directory.openDirectoryError)}const F=await R.json();d(F.path),g(F.parent),p(F.directories)}catch(R){const F=R instanceof Error?R.message:i.directory.openDirectoryError;k(F),T.error(F)}finally{v(!1)}},S=()=>{h(!0),b(e||r||"/")},I=()=>{h(!1),k(""),P("")};return{dirUsage:c,favoritePaths:m,pickerOpen:x,browsePath:l,browseParent:n,directories:f,searchQuery:w,setSearchQuery:P,pickerLoading:C,pickerError:D,cwd:e,pathInput:A,setPathInput:B,filteredDirectories:Q,favoriteDirs:X,recentDirs:Z,isBrowsePathFavorite:ee,loadDirectories:b,openPicker:S,closePicker:I,openCurrentFolder:()=>{e&&b(e)},openHomeFolder:()=>{b(r||"/")},openParentFolder:()=>{n&&b(n)},selectCurrentFolder:()=>{l&&(s(l),U(l,1),T.success(i.directory.folderSelected),I())},toggleFavorite:()=>{l&&a(y=>y.includes(l)?(T.success(i.directory.favoriteRemoved),y.filter(R=>R!==l)):y.length>=se?(T.error(i.directory.maxFavorites(se)),y):(T.success(i.directory.favoriteAdded),[...y,l]))},registerDirUsage:U}}const nt=de("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),_=o.forwardRef(({className:e,variant:s,size:r,asChild:i=!1,...c},u)=>{const m=i?Le:"button";return t.jsx(m,{className:j(nt({variant:s,size:r,className:e})),ref:u,...c})});_.displayName="Button";const at=de("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function le({className:e,variant:s,...r}){return t.jsx("div",{className:j(at({variant:s}),e),...r})}const Y=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("rounded-xl border bg-card text-card-foreground shadow",e),...s}));Y.displayName="Card";const we=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("flex flex-col space-y-1.5 p-6",e),...s}));we.displayName="CardHeader";const Se=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("font-semibold leading-none tracking-tight",e),...s}));Se.displayName="CardTitle";const ye=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("text-sm text-muted-foreground",e),...s}));ye.displayName="CardDescription";const re=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("p-6 pt-0",e),...s}));re.displayName="CardContent";const it=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("flex items-center p-6 pt-0",e),...s}));it.displayName="CardFooter";function ct({onSettingsClick:e,toggleTheme:s,darkMode:r,connectionBadge:i,stepState:c,sessionId:u,status:m,configError:a,children:x}){const{messages:h}=z();return t.jsx(Y,{className:"border-border/50 bg-card/88 shadow-[0_14px_36px_-30px_rgba(15,23,42,0.14)] backdrop-blur-sm",children:t.jsxs(re,{className:"space-y-6 p-6 sm:p-7",children:[t.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-4",children:[t.jsxs("div",{className:"space-y-2",children:[t.jsxs("h1",{className:"text-2xl font-semibold tracking-tight sm:text-3xl",children:["Term",t.jsx("span",{className:"text-muted-foreground",children:"Speak"})]}),t.jsx("p",{className:"max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg",children:h.toolbar.subtitle})]}),t.jsxs("div",{className:"flex items-center gap-2.5",children:[t.jsxs(le,{variant:i.variant,className:"rounded-full border border-border/30 px-4 py-1.5 text-sm font-medium shadow-none",children:[t.jsx("span",{className:j("mr-2 inline-block h-2 w-2 rounded-full",u?"bg-green-500 animate-pulse":m==="connected"?"bg-blue-500":"bg-muted-foreground animate-pulse")}),i.label]}),t.jsxs(_,{variant:"ghost",size:"sm",className:"h-10 gap-2 rounded-full px-4 text-base text-muted-foreground",onClick:e,children:[t.jsx(Fe,{className:"h-4.5 w-4.5"}),h.toolbar.settings]}),t.jsx(_,{variant:"ghost",size:"icon",className:"h-10 w-10 rounded-full",onClick:s,title:r?h.toolbar.lightMode:h.toolbar.darkMode,children:r?t.jsx(Te,{className:"h-4.5 w-4.5"}):t.jsx(De,{className:"h-4.5 w-4.5"})})]})]}),t.jsx("div",{className:"flex flex-wrap gap-2.5",children:c.map(l=>t.jsxs(le,{variant:"secondary",className:j("rounded-full px-3.5 py-1.5 text-sm font-medium sm:text-base",l.done?"border border-primary/10 bg-primary/6 text-foreground":"border border-border/35 bg-background/40 text-muted-foreground"),children:[l.done&&t.jsx("span",{className:"mr-1",children:"✓"}),l.label]},l.label))}),t.jsx("div",{className:"rounded-2xl border border-border/45 bg-background/52 p-5 shadow-[inset_0_1px_0_rgba(255,255,255,0.12)] sm:p-6",children:x}),a&&t.jsx("p",{className:"rounded-xl border border-destructive/40 bg-destructive/8 px-4 py-3 text-base leading-relaxed text-destructive-foreground",children:h.toolbar.serverUnavailable})]})})}const K=Ve,W=Oe,O=o.forwardRef(({className:e,children:s,...r},i)=>t.jsxs(ue,{ref:i,className:j("flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",e),...r,children:[s,t.jsx(He,{asChild:!0,children:t.jsx(me,{className:"h-4 w-4 opacity-50"})})]}));O.displayName=ue.displayName;const je=o.forwardRef(({className:e,...s},r)=>t.jsx(fe,{ref:r,className:j("flex cursor-default items-center justify-center py-1",e),...s,children:t.jsx(_e,{className:"h-4 w-4"})}));je.displayName=fe.displayName;const Ne=o.forwardRef(({className:e,...s},r)=>t.jsx(pe,{ref:r,className:j("flex cursor-default items-center justify-center py-1",e),...s,children:t.jsx(me,{className:"h-4 w-4"})}));Ne.displayName=pe.displayName;const $=o.forwardRef(({className:e,children:s,position:r="popper",...i},c)=>t.jsx(Ae,{children:t.jsxs(ge,{ref:c,className:j("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,...i,children:[t.jsx(je,{}),t.jsx(Me,{className:j("p-1",r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:s}),t.jsx(Ne,{})]})}));$.displayName=ge.displayName;const lt=o.forwardRef(({className:e,...s},r)=>t.jsx(he,{ref:r,className:j("px-2 py-1.5 text-sm font-semibold",e),...s}));lt.displayName=he.displayName;const H=o.forwardRef(({className:e,children:s,...r},i)=>t.jsxs(xe,{ref:i,className:j("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[t.jsx("span",{className:"absolute right-2 flex h-3.5 w-3.5 items-center justify-center",children:t.jsx(ze,{children:t.jsx(Be,{className:"h-4 w-4"})})}),t.jsx(Ue,{children:s})]}));H.displayName=xe.displayName;const dt=o.forwardRef(({className:e,...s},r)=>t.jsx(ve,{ref:r,className:j("-mx-1 my-1 h-px bg-muted",e),...s}));dt.displayName=ve.displayName;function ut({providers:e,provider:s,setProvider:r,cwd:i,hasFolder:c,openPicker:u,canStartSession:m,sessionId:a,startSession:x,stopSession:h,status:l,onSettingsClick:d,speechLang:n,setSpeechLang:g,uiLanguage:f,setUiLanguage:p,fontSize:w,setFontSize:P,isListening:C}){const{messages:v}=z(),D=c?i.split("/").filter(Boolean).at(-1)??(i==="/"?"/":i):v.controls.noFolder;return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"grid gap-6 xl:grid-cols-[minmax(0,1.35fr)_minmax(0,1fr)]",children:[t.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[t.jsxs("div",{className:"space-y-3",children:[t.jsx("label",{className:"text-base font-medium text-foreground",children:v.controls.assistant}),e.length>0?t.jsxs(t.Fragment,{children:[t.jsxs(K,{value:s,onValueChange:r,disabled:!!a,children:[t.jsx(O,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(W,{})}),t.jsx($,{children:e.map(k=>t.jsx(H,{value:k.id,children:k.label},k.id))})]}),t.jsx("p",{className:"text-sm leading-relaxed text-muted-foreground",children:v.controls.assistantReadyHint})]}):t.jsxs(t.Fragment,{children:[t.jsx(_,{variant:"outline",className:"h-12 w-full justify-start rounded-xl px-4 text-base",onClick:d,children:v.controls.configureAssistants}),t.jsx("p",{className:"text-sm leading-relaxed text-muted-foreground",children:v.controls.configureAssistantsHint})]})]}),t.jsxs("div",{className:"space-y-3",children:[t.jsx("label",{className:"text-base font-medium text-foreground",children:v.controls.folder}),t.jsxs("div",{className:"space-y-3",children:[t.jsxs("div",{className:"flex min-h-14 items-start gap-3.5 rounded-xl border border-input bg-background/80 px-4 py-3 shadow-sm",title:i||v.controls.noFolder,children:[t.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-accent/55 text-muted-foreground",children:t.jsx($e,{className:"h-4 w-4"})}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"truncate text-base font-medium text-foreground",children:D}),t.jsx("div",{className:"mt-1 truncate text-sm text-muted-foreground",children:c?i:v.controls.noFolderSelected})]})]}),t.jsx(_,{variant:"outline",size:"sm",className:"h-12 rounded-xl px-4 text-base",onClick:u,disabled:!!a,children:v.controls.chooseFolder}),t.jsx("p",{className:"text-sm leading-relaxed text-muted-foreground",children:v.controls.chooseFolderHint})]})]})]}),t.jsxs("div",{className:"grid gap-5 md:grid-cols-2 2xl:grid-cols-3",children:[t.jsxs("div",{className:"space-y-3",children:[t.jsx("label",{className:"text-base font-medium text-foreground",children:v.controls.interfaceLanguage}),t.jsxs(K,{value:f,onValueChange:k=>p(k),disabled:C,children:[t.jsx(O,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(W,{})}),t.jsxs($,{children:[t.jsx(H,{value:"en",children:v.controls.english}),t.jsx(H,{value:"pt-BR",children:v.controls.portuguese})]})]})]}),t.jsxs("div",{className:"space-y-3",children:[t.jsx("label",{className:"text-base font-medium text-foreground",children:v.controls.dictationLanguage}),t.jsxs(K,{value:n,onValueChange:k=>g(k),disabled:C,children:[t.jsx(O,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(W,{})}),t.jsxs($,{children:[t.jsx(H,{value:"pt-BR",children:v.controls.portuguese}),t.jsx(H,{value:"en-US",children:v.controls.english})]})]})]}),t.jsxs("div",{className:"space-y-3 md:col-span-2 2xl:col-span-1",children:[t.jsx("label",{className:"text-base font-medium text-foreground",children:v.controls.fontSize}),t.jsxs(K,{value:w,onValueChange:k=>P(k),children:[t.jsx(O,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(W,{})}),t.jsxs($,{children:[t.jsx(H,{value:"sm",children:v.controls.fontSmall}),t.jsx(H,{value:"md",children:v.controls.fontMedium}),t.jsx(H,{value:"lg",children:v.controls.fontLarge})]})]})]})]})]}),t.jsxs("div",{className:"flex flex-wrap gap-3 pt-2",children:[t.jsx(_,{className:"h-12 rounded-xl px-6 text-base",onClick:x,disabled:!m,children:l!=="connected"?v.controls.waitingConnection:v.controls.startSession}),t.jsx(_,{variant:"destructive",className:"h-12 rounded-xl px-6 text-base",onClick:h,disabled:!a,children:v.controls.endSession})]}),!a&&t.jsx("p",{className:"text-base leading-relaxed text-muted-foreground",children:e.length===0?v.controls.startHintNeedsAssistant:c?v.controls.startHintReady:v.controls.startHintNeedsFolder})]})}const Ce=o.forwardRef(({className:e,...s},r)=>t.jsx("textarea",{className:j("flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...s}));Ce.displayName="Textarea";function mt({sessionId:e,promptDraft:s,setPromptDraft:r,sendPrompt:i,navigateHistory:c,setPromptHistoryIndex:u,promptTextareaRef:m,isListening:a,toggleVoice:x,speechSupported:h,pushToTalkLabel:l}){const{messages:d}=z();return e?t.jsx(Y,{className:j("border-border/45 bg-card/84 shadow-[0_12px_30px_-28px_rgba(15,23,42,0.12)]",a&&"border-destructive/35 shadow-[0_0_14px_rgba(239,68,68,0.06)]"),children:t.jsxs(re,{className:"grid grid-cols-[auto_1fr_auto] items-start gap-4 p-5 sm:p-6",children:[t.jsx(_,{variant:a?"destructive":"outline",size:"sm",onClick:x,disabled:!h,className:j("h-12 rounded-xl px-5 text-base",a&&"voice-pulse"),children:a?d.prompt.stopDictation:d.prompt.dictatePrompt}),t.jsx(Ce,{ref:m,value:s,onChange:n=>{r(n.target.value),u(null)},onKeyDown:n=>{if(n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),i()),n.key==="ArrowUp"){const g=n.currentTarget;g.selectionStart===0&&g.selectionEnd===0&&(n.preventDefault(),c("older"))}if(n.key==="ArrowDown"){const g=n.currentTarget;g.selectionStart===g.value.length&&g.selectionEnd===g.value.length&&(n.preventDefault(),c("newer"))}},placeholder:d.prompt.placeholder,rows:1,className:"min-h-[48px] resize-none rounded-xl bg-background/72 px-4 py-3 text-base leading-relaxed"}),t.jsx(_,{className:"h-12 rounded-xl px-6 text-base",onClick:i,disabled:!s.trim(),children:d.prompt.send}),t.jsxs("p",{className:"col-span-full pt-2 text-base leading-relaxed text-muted-foreground",children:[d.prompt.shortcuts," · ",d.prompt.pushToTalkHint(l)]})]})}):t.jsx(Y,{className:"border-border/45 bg-card/84 shadow-[0_12px_30px_-28px_rgba(15,23,42,0.12)]",children:t.jsxs(we,{className:"p-5 sm:p-6",children:[t.jsx(Se,{className:"text-xl sm:text-2xl",children:d.prompt.quickFlowTitle}),t.jsx(ye,{className:"max-w-3xl pt-1 text-base leading-relaxed sm:text-lg",children:d.prompt.quickFlowDescription})]})})}const ft=o.lazy(()=>G(()=>import("./DirectoryPickerDialog-D7IDk0pz.js"),__vite__mapDeps([3,1,4,5,0,2])).then(e=>({default:e.DirectoryPickerDialog}))),pt=o.lazy(()=>G(()=>import("./SettingsDialog-uQLxj7UI.js"),__vite__mapDeps([6,1,5,4,0,2])).then(e=>({default:e.SettingsDialog})));function gt({prefs:e}){var U;const{messages:s}=z(),[r,i]=o.useState([]),[c,u]=o.useState(!1),[m,a]=o.useState(!1),x=o.useRef(!1),h=o.useRef(null),l=o.useMemo(()=>typeof navigator<"u"&&/Mac|iPhone|iPad|iPod/.test(navigator.platform),[]),d=l?"Cmd+Shift+Space":"Ctrl+Shift+Space",n=et({onSessionStarted:b=>{var I,L;const S=g.terminalRef.current;S&&(S.writeln(`\r
3
+ \x1B[32m●\x1B[0m ${s.app.sessionStartedTerminal}: \x1B[1m${b.provider}\x1B[0m @ \x1B[36m${b.cwd}\x1B[0m`),T.success(s.app.sessionStartedToast),(I=h.current)==null||I.scrollIntoView({behavior:"smooth",block:"start"}),(L=h.current)==null||L.focus({preventScroll:!0}),n.sendWs({type:"resize",sessionId:b.sessionId,cols:S.cols,rows:S.rows}))},onOutput:b=>{var S;(S=g.terminalRef.current)==null||S.write(b.data)},onSessionExit:b=>{const S=g.terminalRef.current;S&&(S.writeln(`\r
4
+ \x1B[2m[${s.terminal.processClosed} | exit=${b.exitCode}]\x1B[0m`),S.writeln(`\x1B[2m${s.app.sessionClosedTerminal}\x1B[0m`),T.success(s.app.sessionClosedToast))},onError:b=>{var S;(S=g.terminalRef.current)==null||S.writeln(`\r
5
+ \x1B[31m[${s.app.errorLabel}]\x1B[0m ${b.message}`),T.error(b.message)}}),g=tt({sendWs:n.sendWs,sessionIdRef:n.sessionIdRef,sessionId:n.sessionId,fontSize:e.fontSize==="lg"?16:e.fontSize==="sm"?14:15}),f=rt({sendWs:n.sendWs,sessionId:n.sessionId}),p=st({speechLang:e.speechLang,onTranscript:b=>f.setPromptDraft(b)}),w=ot({cwd:e.cwd,setCwd:e.setCwd,homeDir:e.homeDir}),P=e.cwd.trim().length>0,C=e.provider!==""&&r.some(b=>b.id===e.provider),v=n.status==="connected"&&!n.sessionId&&P&&C,D=o.useMemo(()=>n.sessionId?{label:s.connection.active,variant:"default"}:n.status==="connected"?{label:s.connection.ready,variant:"secondary"}:{label:s.connection.connecting,variant:"outline"},[s.connection.active,s.connection.connecting,s.connection.ready,n.sessionId,n.status]),k=o.useMemo(()=>[{label:s.steps.assistant,done:C},{label:s.steps.folder,done:P},{label:s.steps.session,done:!!n.sessionId}],[P,C,s.steps.assistant,s.steps.folder,s.steps.session,n.sessionId]),A=((U=r.find(b=>b.id===e.provider))==null?void 0:U.label)??e.provider,B=o.useCallback(async()=>{try{const b=await fetch("/api/info");if(!b.ok){u(!0);return}const S=await b.json();e.setHomeDir(S.home),i(S.providers),u(!1);const I=S.providers.map(L=>L.id);e.setProvider(L=>L&&I.includes(L)?L:S.defaultProvider||I[0]||""),S.providers.length===0&&a(!0)}catch{u(!0)}},[e.setCwd,e.setHomeDir,e.setProvider]);o.useEffect(()=>{B()},[B]);const Q=()=>{p.isListening||(f.setPromptDraft(""),f.setPromptHistoryIndex(null)),p.toggleVoice()};o.useEffect(()=>{const b=N=>{const V=N;if(!V)return!1;const te=V.tagName;return V.isContentEditable||te==="INPUT"||te==="SELECT"},S=N=>{!p.speechSupported||!n.sessionId||N.repeat||x.current||!(N.code==="Space"&&N.shiftKey&&(l?N.metaKey:N.ctrlKey))||b(N.target)||(N.preventDefault(),x.current=!0,f.setPromptDraft(""),f.setPromptHistoryIndex(null),p.startVoice())},I=()=>{var N;x.current&&(x.current=!1,p.stopVoice(),(N=f.promptTextareaRef.current)==null||N.focus())},L=N=>{(N.code==="Space"||N.key==="Shift"||N.code.startsWith("Shift")||!l&&(N.key==="Control"||N.code.startsWith("Control"))||l&&(N.key==="Meta"||N.code.startsWith("Meta")))&&I()};return window.addEventListener("keydown",S),window.addEventListener("keyup",L),window.addEventListener("blur",I),()=>{window.removeEventListener("keydown",S),window.removeEventListener("keyup",L),window.removeEventListener("blur",I)}},[l,f,p,n.sessionId]);const X=()=>{var b;f.sendPrompt(),p.dictatedFinalRef.current="",(b=g.terminalRef.current)==null||b.focus()},Z=()=>{const b=e.cwd.trim();b&&w.registerDirUsage(b,1),n.sendWs({type:"start_session",provider:e.provider,cwd:b||void 0})},ee=()=>{n.sessionId&&n.sendWs({type:"stop_session",sessionId:n.sessionId})};return t.jsxs("main",{className:j("mx-auto grid min-h-screen max-w-6xl grid-rows-[auto_auto_auto_1fr] gap-4 p-4 sm:gap-5 sm:p-6"),children:[m&&t.jsx(o.Suspense,{fallback:null,children:t.jsx(pt,{open:m,onOpenChange:a,onSaved:B})}),t.jsx(ct,{onSettingsClick:()=>a(!0),toggleTheme:e.toggleTheme,darkMode:e.darkMode,connectionBadge:D,stepState:k,sessionId:n.sessionId,status:n.status,configError:c,children:t.jsx(ut,{providers:r,provider:e.provider,setProvider:e.setProvider,cwd:e.cwd,hasFolder:P,openPicker:w.openPicker,canStartSession:v,sessionId:n.sessionId,startSession:Z,stopSession:ee,status:n.status,onSettingsClick:()=>a(!0),speechLang:e.speechLang,setSpeechLang:e.setSpeechLang,uiLanguage:e.uiLanguage,setUiLanguage:e.setUiLanguage,fontSize:e.fontSize,setFontSize:e.setFontSize,isListening:p.isListening})}),w.pickerOpen&&t.jsx(o.Suspense,{fallback:null,children:t.jsx(ft,{...w})}),t.jsx(mt,{sessionId:n.sessionId,promptDraft:f.promptDraft,setPromptDraft:f.setPromptDraft,sendPrompt:X,navigateHistory:f.navigateHistory,setPromptHistoryIndex:f.setPromptHistoryIndex,promptTextareaRef:f.promptTextareaRef,isListening:p.isListening,toggleVoice:Q,speechSupported:p.speechSupported,pushToTalkLabel:d}),!p.speechSupported&&t.jsx("p",{className:"rounded-xl border border-yellow-500/30 bg-yellow-500/10 px-4 py-3 text-base leading-relaxed text-yellow-500",children:s.app.speechUnsupported}),t.jsxs("section",{ref:h,tabIndex:-1,className:j("overflow-hidden rounded-xl border border-slate-800/80 bg-[#11161b] p-2 transition-colors focus:outline-none","min-h-[58vh]",n.sessionId&&"border-primary/30"),children:[t.jsxs("div",{className:"mb-2 flex items-center gap-2 border-b border-slate-700/60 px-2 py-2.5",children:[t.jsxs("div",{className:"flex gap-1.5",children:[t.jsx("span",{className:"h-2.5 w-2.5 rounded-full bg-red-500/70"}),t.jsx("span",{className:"h-2.5 w-2.5 rounded-full bg-yellow-500/70"}),t.jsx("span",{className:"h-2.5 w-2.5 rounded-full bg-green-500/70"})]}),t.jsx("span",{className:"flex-1 text-center font-mono text-sm text-slate-400",children:n.sessionId?`${A} - ${e.cwd}`:s.app.terminalIdleTitle})]}),t.jsx("div",{className:"h-[calc(100%-34px)] overflow-hidden",ref:g.containerRef})]})]})}function ht(){const e=Ze();return t.jsx(Ye,{language:e.uiLanguage,children:t.jsx(gt,{prefs:e})})}const xt=({...e})=>t.jsx(qe,{theme:"dark",className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e});ke.createRoot(document.getElementById("root")).render(t.jsxs(Pe.StrictMode,{children:[t.jsx(ht,{}),t.jsx(xt,{position:"bottom-right"})]}));export{_ as B,K as S,Ct as a,O as b,j as c,W as d,$ as e,H as f,yt as p,Nt as s,jt as t,z as u};
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-sans:"IBM Plex Sans", "Segoe UI", "Helvetica Neue", Arial, sans-serif;--color-red-500:oklch(63.7% .237 25.331);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-black:#000;--spacing:.25rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:calc(var(--radius) - 4px);--radius-2xl:1rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"IBM Plex Sans", "Segoe UI", "Helvetica Neue", Arial, sans-serif;--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border)}body{background-color:var(--background);color:var(--foreground);font-family:var(--font-sans);background-image:radial-gradient(circle at top,var(--accent) 0%,transparent 42%),linear-gradient(to bottom,var(--background),var(--background))}@supports (color:color-mix(in lab,red,red)){body{background-image:radial-gradient(circle at top,color-mix(in oklab,var(--accent) 10%,transparent) 0%,transparent 42%),linear-gradient(to bottom,color-mix(in oklab,var(--background) 97%,white 3%),var(--background))}}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.col-span-full{grid-column:1/-1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-\[260px\]{height:260px}.h-\[calc\(100\%-34px\)\]{height:calc(100% - 34px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[68vh\]{max-height:68vh}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-\[48px\]{min-height:48px}.min-h-\[58vh\]{min-height:58vh}.min-h-\[60px\]{min-height:60px}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-\[45\%\]{width:45%}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.grid-rows-\[auto_auto_auto_1fr\]{grid-template-rows:auto auto auto 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/30{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,var(--border) 30%,transparent)}}.border-border\/35{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/35{border-color:color-mix(in oklab,var(--border) 35%,transparent)}}.border-border\/45{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/45{border-color:color-mix(in oklab,var(--border) 45%,transparent)}}.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--border) 50%,transparent)}}.border-destructive,.border-destructive\/35{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/35{border-color:color-mix(in oklab,var(--destructive) 35%,transparent)}}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/40{border-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.border-destructive\/50{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--destructive) 50%,transparent)}}.border-input{border-color:var(--input)}.border-primary\/10{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/10{border-color:color-mix(in oklab,var(--primary) 10%,transparent)}}.border-primary\/30{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,var(--primary) 30%,transparent)}}.border-slate-700\/60{border-color:#31415899}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/60{border-color:color-mix(in oklab,var(--color-slate-700) 60%,transparent)}}.border-slate-800\/80{border-color:#1d293dcc}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/80{border-color:color-mix(in oklab,var(--color-slate-800) 80%,transparent)}}.border-transparent{border-color:#0000}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500) 30%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-\[\#11161b\]{background-color:#11161b}.bg-accent\/55{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/55{background-color:color-mix(in oklab,var(--accent) 55%,transparent)}}.bg-background,.bg-background\/40{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,var(--background) 40%,transparent)}}.bg-background\/52{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/52{background-color:color-mix(in oklab,var(--background) 52%,transparent)}}.bg-background\/72{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/72{background-color:color-mix(in oklab,var(--background) 72%,transparent)}}.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background) 80%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/84{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.bg-card\/84{background-color:color-mix(in oklab,var(--card) 84%,transparent)}}.bg-card\/88{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.bg-card\/88{background-color:color-mix(in oklab,var(--card) 88%,transparent)}}.bg-destructive,.bg-destructive\/8{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/8{background-color:color-mix(in oklab,var(--destructive) 8%,transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/70{background-color:#00c758b3}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/70{background-color:color-mix(in oklab,var(--color-green-500) 70%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-muted-foreground{background-color:var(--muted-foreground)}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/6{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/6{background-color:color-mix(in oklab,var(--primary) 6%,transparent)}}.bg-red-500\/70{background-color:#fb2c36b3}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/70{background-color:color-mix(in oklab,var(--color-red-500) 70%,transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500) 10%,transparent)}}.bg-yellow-500\/70{background-color:#edb200b3}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/70{background-color:color-mix(in oklab,var(--color-yellow-500) 70%,transparent)}}.fill-current{fill:currentColor}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[1px\]{padding:1px}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-card-foreground{color:var(--card-foreground)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/40{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,var(--muted-foreground) 40%,transparent)}}.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--muted-foreground) 60%,transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-slate-400{color:var(--color-slate-400)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_14px_rgba\(239\,68\,68\,0\.06\)\]{--tw-shadow:0 0 14px var(--tw-shadow-color,#ef44440f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_12px_30px_-28px_rgba\(15\,23\,42\,0\.12\)\]{--tw-shadow:0 12px 30px -28px var(--tw-shadow-color,#0f172a1f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_14px_36px_-30px_rgba\(15\,23\,42\,0\.14\)\]{--tw-shadow:0 14px 36px -30px var(--tw-shadow-color,#0f172a24);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.12\)\]{--tw-shadow:inset 0 1px 0 var(--tw-shadow-color,#ffffff1f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-\[\.toast\]\:bg-muted:is(:where(.group).toast *){background-color:var(--muted)}.group-\[\.toast\]\:bg-primary:is(:where(.group).toast *){background-color:var(--primary)}.group-\[\.toast\]\:text-muted-foreground:is(:where(.group).toast *){color:var(--muted-foreground)}.group-\[\.toast\]\:text-primary-foreground:is(:where(.group).toast *){color:var(--primary-foreground)}.group-\[\.toaster\]\:border-border:is(:where(.group).toaster *){border-color:var(--border)}.group-\[\.toaster\]\:bg-background:is(:where(.group).toaster *){background-color:var(--background)}.group-\[\.toaster\]\:text-foreground:is(:where(.group).toaster *){color:var(--foreground)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media(hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-yellow-400:hover{color:var(--color-yellow-400)}.hover\:text-yellow-500:hover{color:var(--color-yellow-500)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}@media(min-width:40rem){.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:gap-5{gap:calc(var(--spacing) * 5)}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-\[minmax\(0\,1\.35fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr)}}@media(min-width:96rem){.\32xl\:col-span-1{grid-column:span 1/span 1}.\32xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}body[data-font-size=sm] .text-sm,html[data-font-size=sm] .text-sm{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}body[data-font-size=sm] .text-base,html[data-font-size=sm] .text-base{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}body[data-font-size=sm] .text-lg,html[data-font-size=sm] .text-lg{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}body[data-font-size=lg] .text-xs,html[data-font-size=lg] .text-xs{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}body[data-font-size=lg] .text-sm,html[data-font-size=lg] .text-sm{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}body[data-font-size=lg] .text-base,html[data-font-size=lg] .text-base{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}body[data-font-size=lg] .text-lg,html[data-font-size=lg] .text-lg{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}:root{--radius:.625rem;--background:oklch(97.8% .004 95);--foreground:oklch(30.5% .014 247);--card:oklch(98.8% .003 95);--card-foreground:oklch(30.5% .014 247);--popover:oklch(99% .003 95);--popover-foreground:oklch(30.5% .014 247);--primary:oklch(45% .07 232);--primary-foreground:oklch(99.2% .002 95);--secondary:oklch(96.6% .006 220);--secondary-foreground:oklch(34% .018 245);--muted:oklch(97.2% .004 220);--muted-foreground:oklch(50% .012 248);--accent:oklch(96.5% .008 215);--accent-foreground:oklch(34% .018 245);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(92.5% .007 228);--input:oklch(92.5% .007 228);--ring:oklch(66% .055 232);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(22.5% .012 248);--foreground:oklch(91.5% .008 230);--card:oklch(24.8% .014 247);--card-foreground:oklch(91.5% .008 230);--popover:oklch(24.8% .014 247);--popover-foreground:oklch(91.5% .008 230);--primary:oklch(69% .075 220);--primary-foreground:oklch(20.5% .012 248);--secondary:oklch(29.2% .015 244);--secondary-foreground:oklch(90% .008 230);--muted:oklch(27.8% .012 244);--muted-foreground:oklch(72.5% .015 234);--accent:oklch(30.2% .015 242);--accent-foreground:oklch(93% .008 230);--destructive:oklch(39.6% .141 25.723);--destructive-foreground:oklch(63.7% .237 25.331);--border:oklch(33.5% .012 240);--input:oklch(33.5% .012 240);--ring:oklch(60% .06 224);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(26.9% 0 0);--sidebar-ring:oklch(43.9% 0 0)}.xterm{padding:4px}.xterm-viewport::-webkit-scrollbar{width:6px}.xterm-viewport::-webkit-scrollbar-track{background:0 0}.xterm-viewport::-webkit-scrollbar-thumb{background:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.xterm-viewport::-webkit-scrollbar-thumb{background:color-mix(in oklab,var(--muted-foreground) 48%,transparent)}}.xterm-viewport::-webkit-scrollbar-thumb{border-radius:3px}@keyframes voice-ring{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.3)}}.voice-pulse{position:relative}.voice-pulse:after{content:"";border-radius:var(--radius-sm);opacity:0;border:2px solid oklch(63.7% .237 25.331);animation:1.5s ease-out infinite voice-ring;position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes pulse{50%{opacity:.5}}