promptmic 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,6 +71,12 @@ If you want the browser to open automatically:
71
71
  npx promptmic --open
72
72
  ```
73
73
 
74
+ If you want to delete the saved local config and start fresh:
75
+
76
+ ```bash
77
+ npx promptmic --reset-config
78
+ ```
79
+
74
80
  If you install it globally, the executable name is:
75
81
 
76
82
  ```bash
@@ -171,6 +177,18 @@ If you want to use shell wrappers or functions such as `personal` or `work`, the
171
177
  - `npm run start:repo`: forces `./config.json`
172
178
  - `npx promptmic`: should behave like `npm run start`
173
179
 
180
+ To reset the default local config file used by the published CLI:
181
+
182
+ ```bash
183
+ npx promptmic --reset-config
184
+ ```
185
+
186
+ To reset a specific config file instead:
187
+
188
+ ```bash
189
+ npx promptmic --config ./config.json --reset-config
190
+ ```
191
+
174
192
  ### Provider fields
175
193
 
176
194
  | Field | Type | Required | Description |
@@ -184,9 +202,19 @@ If you want to use shell wrappers or functions such as `personal` or `work`, the
184
202
  ### Execution modes
185
203
 
186
204
  - `direct` is the recommended default for most providers because it runs the CLI directly and avoids shell startup noise
205
+ - on macOS and Linux, `direct` also probes the user's interactive shell to recover user PATH entries when the app was launched from a GUI or another stripped-down environment
187
206
  - `shell` is useful when you rely on shell wrappers, aliases, or functions such as `personal`, `work`, or custom environment bootstrap commands
207
+ - `direct` still requires a real executable; aliases and shell functions remain a `shell` use case
188
208
  - In `shell` mode, anything printed by your shell startup files can appear at the start of the session
189
209
 
210
+ ### Troubleshooting command resolution
211
+
212
+ - If a provider works in your terminal but fails inside TermSpeak, prefer `direct` with a real executable name or absolute path
213
+ - If the executable lives in a user-managed bin directory such as `~/.local/bin`, `~/.nvm/.../bin`, or a Homebrew prefix, TermSpeak will try to recover those PATH entries from your interactive shell on macOS and Linux
214
+ - For maximum portability across macOS, Linux, and Windows, use an absolute executable path when you can
215
+ - If you depend on aliases, shell functions, or wrapper commands, switch that provider to `shell`
216
+ - You can also set `PATH` explicitly in the provider `env` when you need a fully controlled runtime environment
217
+
190
218
  ### Example: multiple Claude accounts with direct execution
191
219
 
192
220
  ```json
@@ -1,7 +1,22 @@
1
1
  import pty from 'node-pty';
2
+ import { execFileSync } from 'node:child_process';
2
3
  import fs from 'node:fs';
3
4
  import path from 'node:path';
4
5
  import { HOME_DIR } from './runtime-config.js';
6
+ function getEnvValue(env, key, platform) {
7
+ if (platform !== 'win32')
8
+ return env[key];
9
+ const actualKey = Object.keys(env).find((candidate) => candidate.toLowerCase() === key.toLowerCase());
10
+ return actualKey ? env[actualKey] : undefined;
11
+ }
12
+ function setEnvValue(env, key, value, platform) {
13
+ if (platform !== 'win32') {
14
+ env[key] = value;
15
+ return;
16
+ }
17
+ const actualKey = Object.keys(env).find((candidate) => candidate.toLowerCase() === key.toLowerCase()) ?? key;
18
+ env[actualKey] = value;
19
+ }
5
20
  function isExecutable(filePath, platform) {
6
21
  try {
7
22
  fs.accessSync(filePath, platform === 'win32' ? fs.constants.F_OK : fs.constants.X_OK);
@@ -60,8 +75,29 @@ function readShebang(filePath) {
60
75
  return null;
61
76
  }
62
77
  }
63
- function resolveDirectSpawnTarget(command, args, env, platform) {
64
- const executable = resolveDirectExecutable(command, env.PATH, platform, env.PATHEXT) ?? command;
78
+ function assertValidWorkingDirectory(cwd) {
79
+ let stat;
80
+ try {
81
+ stat = fs.statSync(cwd);
82
+ }
83
+ catch {
84
+ throw new Error(`Working directory "${cwd}" does not exist. Choose another folder or reset the saved local config.`);
85
+ }
86
+ if (!stat.isDirectory()) {
87
+ throw new Error(`Working directory "${cwd}" is not a directory. Choose another folder or reset the saved local config.`);
88
+ }
89
+ }
90
+ function resolveDirectSpawnTarget(command, args, env, platform, userShell, execFileSyncFn) {
91
+ const expandedCommand = expandTilde(command);
92
+ const executableFromPath = resolveDirectExecutable(command, getEnvValue(env, 'PATH', platform), platform, getEnvValue(env, 'PATHEXT', platform));
93
+ const shellProbe = executableFromPath ? null : readShellProbe(command, userShell, env, platform, execFileSyncFn);
94
+ if (shellProbe?.shellPath) {
95
+ const mergedPath = mergePathValues(shellProbe.shellPath, getEnvValue(env, 'PATH', platform), platform);
96
+ if (mergedPath)
97
+ setEnvValue(env, 'PATH', mergedPath, platform);
98
+ }
99
+ const executable = shellProbe?.executablePath || executableFromPath || expandedCommand;
100
+ const commandFound = Boolean(shellProbe?.executablePath || executableFromPath);
65
101
  try {
66
102
  const realPath = fs.realpathSync(executable);
67
103
  const shebang = readShebang(realPath)?.toLowerCase() ?? '';
@@ -69,6 +105,7 @@ function resolveDirectSpawnTarget(command, args, env, platform) {
69
105
  return {
70
106
  file: process.execPath,
71
107
  args: [realPath, ...args],
108
+ commandFound: true,
72
109
  };
73
110
  }
74
111
  }
@@ -78,6 +115,7 @@ function resolveDirectSpawnTarget(command, args, env, platform) {
78
115
  return {
79
116
  file: executable,
80
117
  args,
118
+ commandFound,
81
119
  };
82
120
  }
83
121
  export function expandTilde(value) {
@@ -88,15 +126,76 @@ function quoteShellArg(value) {
88
126
  return "''";
89
127
  return `'${value.replace(/'/g, `'\\''`)}'`;
90
128
  }
91
- function formatSpawnError(entry, error) {
129
+ function mergePathValues(preferredPath, fallbackPath, platform) {
130
+ const delimiter = platform === 'win32' ? ';' : path.delimiter;
131
+ const seen = new Set();
132
+ const merged = [];
133
+ for (const source of [preferredPath, fallbackPath]) {
134
+ if (!source)
135
+ continue;
136
+ for (const entry of source.split(delimiter)) {
137
+ const trimmed = entry.trim();
138
+ if (!trimmed)
139
+ continue;
140
+ const key = platform === 'win32' ? trimmed.toLowerCase() : trimmed;
141
+ if (seen.has(key))
142
+ continue;
143
+ seen.add(key);
144
+ merged.push(trimmed);
145
+ }
146
+ }
147
+ return merged.length > 0 ? merged.join(delimiter) : undefined;
148
+ }
149
+ function readShellProbe(command, userShell, env, platform, execFileSyncFn = execFileSync) {
150
+ if (platform === 'win32' || !userShell)
151
+ return null;
152
+ if (!command || command.includes('/') || command.includes('\\'))
153
+ return null;
154
+ const pathStartMarker = '__TERMSPEAK_PATH_START__';
155
+ const pathEndMarker = '__TERMSPEAK_PATH_END__';
156
+ const commandStartMarker = '__TERMSPEAK_COMMAND_START__';
157
+ const commandEndMarker = '__TERMSPEAK_COMMAND_END__';
158
+ const shellCommand = [
159
+ `printf '${pathStartMarker}%s${pathEndMarker}\\n' "$PATH"`,
160
+ `resolved=$(command -v ${quoteShellArg(command)} 2>/dev/null || true)`,
161
+ `printf '${commandStartMarker}%s${commandEndMarker}' "$resolved"`,
162
+ ].join('; ');
163
+ try {
164
+ const output = execFileSyncFn(userShell, ['-ic', shellCommand], {
165
+ encoding: 'utf8',
166
+ env: { ...env },
167
+ timeout: 3000,
168
+ maxBuffer: 64 * 1024,
169
+ stdio: ['ignore', 'pipe', 'ignore'],
170
+ });
171
+ const shellPath = output.match(new RegExp(`${pathStartMarker}([\\s\\S]*?)${pathEndMarker}`))?.[1]?.trim() || undefined;
172
+ const commandLines = output
173
+ .match(new RegExp(`${commandStartMarker}([\\s\\S]*?)${commandEndMarker}`))?.[1]
174
+ ?.split(/\r?\n/)
175
+ .map((line) => line.trim())
176
+ .filter(Boolean);
177
+ const executablePath = commandLines
178
+ ? [...commandLines].reverse().find((line) => line.includes('/') || line.includes('\\'))
179
+ : undefined;
180
+ if (!executablePath)
181
+ return shellPath ? { executablePath: '', shellPath } : null;
182
+ const resolvedPath = expandTilde(executablePath);
183
+ return isExecutable(resolvedPath, platform) ? { executablePath: resolvedPath, shellPath } : shellPath ? { executablePath: '', shellPath } : null;
184
+ }
185
+ catch {
186
+ return null;
187
+ }
188
+ }
189
+ function formatSpawnError(entry, error, commandFound = true) {
92
190
  const errorMessage = error instanceof Error ? error.message : String(error ?? '');
93
191
  const errorCode = error && typeof error === 'object' && 'code' in error && typeof error.code === 'string' ? error.code : undefined;
94
192
  if (entry.executionMode === 'direct' &&
193
+ !commandFound &&
95
194
  (errorCode === 'ENOENT' ||
96
195
  /posix_spawnp failed/i.test(errorMessage) ||
97
196
  /spawn .* ENOENT/i.test(errorMessage) ||
98
197
  /not found/i.test(errorMessage))) {
99
- return new Error(`Could not start "${entry.label}". Command "${entry.command}" was not found in PATH. Install it or switch this provider to Shell command if it depends on a shell wrapper.`);
198
+ return new Error(`Could not start "${entry.label}". Command "${entry.command}" was not found in PATH. Install it, use an absolute path, set PATH in provider env, or switch this provider to Shell command if it depends on a shell wrapper.`);
100
199
  }
101
200
  if (error instanceof Error) {
102
201
  return new Error(`Could not start "${entry.label}": ${error.message}`);
@@ -132,6 +231,7 @@ export function createPtySpawner(options = {}) {
132
231
  const spawn = options.spawn ?? pty.spawn;
133
232
  const shell = options.shell ?? process.env.SHELL ?? '/bin/bash';
134
233
  const platform = options.platform ?? process.platform;
234
+ const execFileSyncFn = options.execFileSync ?? execFileSync;
135
235
  return ({ provider, cwd, config }) => {
136
236
  const entry = config.providers[provider];
137
237
  const command = resolveProviderCommand(config, provider, shell);
@@ -139,9 +239,10 @@ export function createPtySpawner(options = {}) {
139
239
  ...baseEnv,
140
240
  ...command.envOverrides,
141
241
  };
242
+ assertValidWorkingDirectory(cwd);
142
243
  const spawnTarget = command.executionMode === 'direct'
143
- ? resolveDirectSpawnTarget(command.file, command.args, env, platform)
144
- : { file: command.file, args: command.args };
244
+ ? resolveDirectSpawnTarget(command.file, command.args, env, platform, shell, execFileSyncFn)
245
+ : { file: command.file, args: command.args, commandFound: true };
145
246
  try {
146
247
  return spawn(spawnTarget.file, spawnTarget.args, {
147
248
  name: 'xterm-256color',
@@ -152,7 +253,7 @@ export function createPtySpawner(options = {}) {
152
253
  });
153
254
  }
154
255
  catch (error) {
155
- throw formatSpawnError(entry, error);
256
+ throw formatSpawnError(entry, error, spawnTarget.commandFound);
156
257
  }
157
258
  };
158
259
  }
@@ -1 +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};
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-y1qudB0y.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-jnu2WsBi.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};
@@ -1 +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};
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-y1qudB0y.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-jnu2WsBi.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-CIdtkYr4.js","assets/scroll-area-jnu2WsBi.js","assets/ui-vendor-Btc0UVaC.js","assets/SettingsDialog-D9VZ2obu.js"])))=>i.map(i=>d[i]);
2
+ import{r as o,j as t,d as Pe,R as Re}from"./react-vendor-DQ3p2tNP.js";import{t as Ie,c as Le,a as F,S as Fe,b as ue,d as Te,e as De,M as Ae,T as me,I as He,C as fe,f as pe,g as _e,h as ge,P as ze,i as he,V as Me,L as xe,j as ve,k as Be,l as Ue,m as Ve,n as be,R as Oe,o as $e,F as qe,p as Ke}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 We="modulepreload",Ge=function(e){return"/"+e},ne={},Y=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=Ge(h),h in ne)return;ne[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":We,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 Ie(Le(e))}const Je={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.",savedFolderReset:"The saved project folder is no longer available. Choose another folder.",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.",savedFolderReset:"A pasta do projeto salva não está mais disponível. Escolha outra pasta.",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"}}},we=o.createContext(null);function Ye(e){return e==="pt-BR"?"pt-BR":"en"}function ae(){return(typeof navigator>"u"?[]:[navigator.language,...navigator.languages??[]]).some(s=>s==null?void 0:s.toLowerCase().startsWith("pt"))?"pt-BR":"en"}function Qe({language:e,children:s}){return o.useEffect(()=>{document.documentElement.lang=e},[e]),t.jsx(we.Provider,{value:{language:e,messages:Je[e]},children:s})}function B(){const e=o.useContext(we);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"},ie=30,Xe=80,re=6,M=(e,s)=>{try{const r=window.localStorage.getItem(e);return r?JSON.parse(r):s}catch{return s}},Q=(e,s)=>{window.localStorage.setItem(e,JSON.stringify(s))},Ze=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)),ce=e=>Object.fromEntries(Object.entries(e).sort((s,r)=>r[1]-s[1]).slice(0,Xe)),le=(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 et(){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:ae()==="pt-BR"?"pt-BR":"en-US"}),[u,m]=o.useState(()=>{const p=window.localStorage.getItem(E.uiLanguage);if(p)return Ye(p);const w=M(E.preferences,{});return w.uiLanguage?w.uiLanguage:ae()}),[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(()=>{Q(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 tt(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 st({sendWs:e,sessionIdRef:s,sessionId:r,fontSize:i}){const{messages:c}=B(),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([Y(()=>import("./terminal-CnuCQtKf.js").then(C=>C.x),__vite__mapDeps([0,1,2])),Y(()=>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 rt({speechLang:e,onTranscript:s}){const{messages:r}=B(),[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],z=((v=(C=k[0])==null?void 0:C.transcript)==null?void 0:v.trim())??"";z&&(k.isFinal?m.current=`${m.current} ${z}`.trim():w=`${w} ${z}`.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),F.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 ot({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(()=>{Q(E.promptHistory,c.slice(0,ie))},[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,ie)),a(null),i(""),F.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 nt({cwd:e,setCwd:s,homeDir:r}){const{messages:i}=B(),[c,u]=o.useState(()=>Ze(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(""),[z,U]=o.useState("");o.useEffect(()=>{Q(E.dirUsage,ce(c))},[c]),o.useEffect(()=>{Q(E.favorites,m)},[m]),o.useEffect(()=>{U(l)},[l]);const V=o.useMemo(()=>{const y=w.trim().toLowerCase();return y?f.filter(R=>R.name.toLowerCase().includes(y)):f},[f,w]),Z=o.useMemo(()=>m.slice(0,re).map(y=>({label:le(y,r,i.directory.homeLabel),path:y})),[m,r,i.directory.homeLabel]),ee=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:le(y,r,i.directory.homeLabel),path:y})),[e,c,m,r,i.directory.homeLabel]),te=o.useMemo(()=>!!l&&m.includes(l),[l,m]),K=(y,R=1)=>{const T=y.trim();T&&u(W=>{const ke={...W,[T]:(W[T]??0)+R};return ce(ke)})},_=async y=>{v(!0),k(""),P("");try{const R=await fetch(`/api/fs/list?path=${encodeURIComponent(y)}`);if(!R.ok){const W=await R.json();throw new Error(W.error||i.directory.openDirectoryError)}const T=await R.json();d(T.path),g(T.parent),p(T.directories)}catch(R){const T=R instanceof Error?R.message:i.directory.openDirectoryError;k(T),F.error(T)}finally{v(!1)}},b=()=>{h(!0),_(e||r||"/")},S=()=>{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:z,setPathInput:U,filteredDirectories:V,favoriteDirs:Z,recentDirs:ee,isBrowsePathFavorite:te,loadDirectories:_,openPicker:b,closePicker:S,openCurrentFolder:()=>{e&&_(e)},openHomeFolder:()=>{_(r||"/")},openParentFolder:()=>{n&&_(n)},selectCurrentFolder:()=>{l&&(s(l),K(l,1),F.success(i.directory.folderSelected),S())},toggleFavorite:()=>{l&&a(y=>y.includes(l)?(F.success(i.directory.favoriteRemoved),y.filter(R=>R!==l)):y.length>=re?(F.error(i.directory.maxFavorites(re)),y):(F.success(i.directory.favoriteAdded),[...y,l]))},registerDirUsage:K}}const at=ue("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"}}),H=o.forwardRef(({className:e,variant:s,size:r,asChild:i=!1,...c},u)=>{const m=i?Fe:"button";return t.jsx(m,{className:j(at({variant:s,size:r,className:e})),ref:u,...c})});H.displayName="Button";const it=ue("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 de({className:e,variant:s,...r}){return t.jsx("div",{className:j(it({variant:s}),e),...r})}const X=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("rounded-xl border bg-card text-card-foreground shadow",e),...s}));X.displayName="Card";const Se=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("flex flex-col space-y-1.5 p-6",e),...s}));Se.displayName="CardHeader";const ye=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("font-semibold leading-none tracking-tight",e),...s}));ye.displayName="CardTitle";const je=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("text-sm text-muted-foreground",e),...s}));je.displayName="CardDescription";const oe=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("p-6 pt-0",e),...s}));oe.displayName="CardContent";const ct=o.forwardRef(({className:e,...s},r)=>t.jsx("div",{ref:r,className:j("flex items-center p-6 pt-0",e),...s}));ct.displayName="CardFooter";function lt({onSettingsClick:e,toggleTheme:s,darkMode:r,connectionBadge:i,stepState:c,sessionId:u,status:m,configError:a,children:x}){const{messages:h}=B();return t.jsx(X,{className:"border-border/50 bg-card/88 shadow-[0_14px_36px_-30px_rgba(15,23,42,0.14)] backdrop-blur-sm",children:t.jsxs(oe,{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(de,{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(H,{variant:"ghost",size:"sm",className:"h-10 gap-2 rounded-full px-4 text-base text-muted-foreground",onClick:e,children:[t.jsx(Te,{className:"h-4.5 w-4.5"}),h.toolbar.settings]}),t.jsx(H,{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(De,{className:"h-4.5 w-4.5"}):t.jsx(Ae,{className:"h-4.5 w-4.5"})})]})]}),t.jsx("div",{className:"flex flex-wrap gap-2.5",children:c.map(l=>t.jsxs(de,{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 G=Oe,J=$e,$=o.forwardRef(({className:e,children:s,...r},i)=>t.jsxs(me,{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(fe,{className:"h-4 w-4 opacity-50"})})]}));$.displayName=me.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(_e,{className:"h-4 w-4"})}));Ne.displayName=pe.displayName;const Ce=o.forwardRef(({className:e,...s},r)=>t.jsx(ge,{ref:r,className:j("flex cursor-default items-center justify-center py-1",e),...s,children:t.jsx(fe,{className:"h-4 w-4"})}));Ce.displayName=ge.displayName;const q=o.forwardRef(({className:e,children:s,position:r="popper",...i},c)=>t.jsx(ze,{children:t.jsxs(he,{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(Ne,{}),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(Ce,{})]})}));q.displayName=he.displayName;const dt=o.forwardRef(({className:e,...s},r)=>t.jsx(xe,{ref:r,className:j("px-2 py-1.5 text-sm font-semibold",e),...s}));dt.displayName=xe.displayName;const A=o.forwardRef(({className:e,children:s,...r},i)=>t.jsxs(ve,{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(Be,{children:t.jsx(Ue,{className:"h-4 w-4"})})}),t.jsx(Ve,{children:s})]}));A.displayName=ve.displayName;const ut=o.forwardRef(({className:e,...s},r)=>t.jsx(be,{ref:r,className:j("-mx-1 my-1 h-px bg-muted",e),...s}));ut.displayName=be.displayName;function mt({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}=B(),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(G,{value:s,onValueChange:r,disabled:!!a,children:[t.jsx($,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(J,{})}),t.jsx(q,{children:e.map(k=>t.jsx(A,{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(H,{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(qe,{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(H,{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(G,{value:f,onValueChange:k=>p(k),disabled:C,children:[t.jsx($,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(J,{})}),t.jsxs(q,{children:[t.jsx(A,{value:"en",children:v.controls.english}),t.jsx(A,{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(G,{value:n,onValueChange:k=>g(k),disabled:C,children:[t.jsx($,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(J,{})}),t.jsxs(q,{children:[t.jsx(A,{value:"pt-BR",children:v.controls.portuguese}),t.jsx(A,{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(G,{value:w,onValueChange:k=>P(k),children:[t.jsx($,{className:"h-12 w-full rounded-xl bg-background/80 text-base",children:t.jsx(J,{})}),t.jsxs(q,{children:[t.jsx(A,{value:"sm",children:v.controls.fontSmall}),t.jsx(A,{value:"md",children:v.controls.fontMedium}),t.jsx(A,{value:"lg",children:v.controls.fontLarge})]})]})]})]})]}),t.jsxs("div",{className:"flex flex-wrap gap-3 pt-2",children:[t.jsx(H,{className:"h-12 rounded-xl px-6 text-base",onClick:x,disabled:!m,children:l!=="connected"?v.controls.waitingConnection:v.controls.startSession}),t.jsx(H,{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 Ee=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}));Ee.displayName="Textarea";function ft({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}=B();return e?t.jsx(X,{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(oe,{className:"grid grid-cols-[auto_1fr_auto] items-start gap-4 p-5 sm:p-6",children:[t.jsx(H,{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(Ee,{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(H,{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(X,{className:"border-border/45 bg-card/84 shadow-[0_12px_30px_-28px_rgba(15,23,42,0.12)]",children:t.jsxs(Se,{className:"p-5 sm:p-6",children:[t.jsx(ye,{className:"text-xl sm:text-2xl",children:d.prompt.quickFlowTitle}),t.jsx(je,{className:"max-w-3xl pt-1 text-base leading-relaxed sm:text-lg",children:d.prompt.quickFlowDescription})]})})}const pt=o.lazy(()=>Y(()=>import("./DirectoryPickerDialog-CIdtkYr4.js"),__vite__mapDeps([3,1,4,5,0,2])).then(e=>({default:e.DirectoryPickerDialog}))),gt=o.lazy(()=>Y(()=>import("./SettingsDialog-D9VZ2obu.js"),__vite__mapDeps([6,1,5,4,0,2])).then(e=>({default:e.SettingsDialog})));function ht({prefs:e}){var _;const{messages:s}=B(),[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=tt({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`),F.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`),F.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}`),F.error(b.message)}}),g=st({sendWs:n.sendWs,sessionIdRef:n.sessionIdRef,sessionId:n.sessionId,fontSize:e.fontSize==="lg"?16:e.fontSize==="sm"?14:15}),f=ot({sendWs:n.sendWs,sessionId:n.sessionId}),p=rt({speechLang:e.speechLang,onTranscript:b=>f.setPromptDraft(b)}),w=nt({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]),z=((_=r.find(b=>b.id===e.provider))==null?void 0:_.label)??e.provider,U=o.useCallback(async(b,S=!0)=>{const I=b.trim();if(!I)return!1;try{return(await fetch(`/api/fs/list?path=${encodeURIComponent(I)}`)).ok?!0:(e.setCwd(""),S&&F.error(s.directory.savedFolderReset),!1)}catch{return!1}},[s.directory.savedFolderReset,e.setCwd]),V=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(()=>{V()},[V]),o.useEffect(()=>{const b=e.cwd.trim();b&&U(b,!1)},[U,e.cwd]);const Z=()=>{p.isListening||(f.setPromptDraft(""),f.setPromptHistoryIndex(null)),p.toggleVoice()};o.useEffect(()=>{const b=N=>{const O=N;if(!O)return!1;const se=O.tagName;return O.isContentEditable||se==="INPUT"||se==="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 ee=()=>{var b;f.sendPrompt(),p.dictatedFinalRef.current="",(b=g.terminalRef.current)==null||b.focus()},te=async()=>{const b=e.cwd.trim();!b||!await U(b)||(b&&w.registerDirUsage(b,1),n.sendWs({type:"start_session",provider:e.provider,cwd:b||void 0}))},K=()=>{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(gt,{open:m,onOpenChange:a,onSaved:V})}),t.jsx(lt,{onSettingsClick:()=>a(!0),toggleTheme:e.toggleTheme,darkMode:e.darkMode,connectionBadge:D,stepState:k,sessionId:n.sessionId,status:n.status,configError:c,children:t.jsx(mt,{providers:r,provider:e.provider,setProvider:e.setProvider,cwd:e.cwd,hasFolder:P,openPicker:w.openPicker,canStartSession:v,sessionId:n.sessionId,startSession:te,stopSession:K,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(pt,{...w})}),t.jsx(ft,{sessionId:n.sessionId,promptDraft:f.promptDraft,setPromptDraft:f.setPromptDraft,sendPrompt:ee,navigateHistory:f.navigateHistory,setPromptHistoryIndex:f.setPromptHistoryIndex,promptTextareaRef:f.promptTextareaRef,isListening:p.isListening,toggleVoice:Z,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?`${z} - ${e.cwd}`:s.app.terminalIdleTitle})]}),t.jsx("div",{className:"h-[calc(100%-34px)] overflow-hidden",ref:g.containerRef})]})]})}function xt(){const e=et();return t.jsx(Qe,{language:e.uiLanguage,children:t.jsx(ht,{prefs:e})})}const vt=({...e})=>t.jsx(Ke,{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});Pe.createRoot(document.getElementById("root")).render(t.jsxs(Re.StrictMode,{children:[t.jsx(xt,{}),t.jsx(vt,{position:"bottom-right"})]}));export{H as B,G as S,Ct as a,$ as b,j as c,J as d,q as e,A as f,yt as p,Nt as s,jt as t,B as u};
@@ -1 +1 @@
1
- import{r,j as a}from"./react-vendor-DQ3p2tNP.js";import{c as o}from"./index-BBNxXHaX.js";import{x as u,y as g,z as d,A as b,X as N,B as n,O as i,D as c,E as f,G as y,H as h,J as m,K as j}from"./ui-vendor-Btc0UVaC.js";const w=r.forwardRef(({className:s,type:e,...t},l)=>a.jsx("input",{type:e,className:o("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",s),ref:l,...t}));w.displayName="Input";const I=u,v=g,p=r.forwardRef(({className:s,...e},t)=>a.jsx(i,{ref:t,className:o("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",s),...e}));p.displayName=i.displayName;const D=r.forwardRef(({className:s,children:e,...t},l)=>a.jsxs(v,{children:[a.jsx(p,{}),a.jsxs(d,{ref:l,className:o("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",s),...t,children:[e,a.jsxs(b,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[a.jsx(N,{className:"h-4 w-4"}),a.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));D.displayName=d.displayName;const R=({className:s,...e})=>a.jsx("div",{className:o("flex flex-col space-y-1.5 text-center sm:text-left",s),...e});R.displayName="DialogHeader";const z=({className:s,...e})=>a.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",s),...e});z.displayName="DialogFooter";const S=r.forwardRef(({className:s,...e},t)=>a.jsx(n,{ref:t,className:o("text-lg font-semibold leading-none tracking-tight",s),...e}));S.displayName=n.displayName;const C=r.forwardRef(({className:s,...e},t)=>a.jsx(c,{ref:t,className:o("text-sm text-muted-foreground",s),...e}));C.displayName=c.displayName;const k=r.forwardRef(({className:s,children:e,...t},l)=>a.jsxs(f,{ref:l,className:o("relative overflow-hidden",s),...t,children:[a.jsx(y,{className:"h-full w-full rounded-[inherit]",children:e}),a.jsx(x,{}),a.jsx(h,{})]}));k.displayName=f.displayName;const x=r.forwardRef(({className:s,orientation:e="vertical",...t},l)=>a.jsx(m,{ref:l,orientation:e,className:o("flex touch-none select-none transition-colors",e==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",e==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",s),...t,children:a.jsx(j,{className:"relative flex-1 rounded-full bg-border"})}));x.displayName=m.displayName;export{I as D,w as I,k as S,D as a,R as b,S as c,z as d};
1
+ import{r,j as a}from"./react-vendor-DQ3p2tNP.js";import{c as o}from"./index-y1qudB0y.js";import{x as u,y as g,z as d,A as b,X as N,B as n,O as i,D as c,E as f,G as y,H as h,J as m,K as j}from"./ui-vendor-Btc0UVaC.js";const w=r.forwardRef(({className:s,type:e,...t},l)=>a.jsx("input",{type:e,className:o("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",s),ref:l,...t}));w.displayName="Input";const I=u,v=g,p=r.forwardRef(({className:s,...e},t)=>a.jsx(i,{ref:t,className:o("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",s),...e}));p.displayName=i.displayName;const D=r.forwardRef(({className:s,children:e,...t},l)=>a.jsxs(v,{children:[a.jsx(p,{}),a.jsxs(d,{ref:l,className:o("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",s),...t,children:[e,a.jsxs(b,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[a.jsx(N,{className:"h-4 w-4"}),a.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));D.displayName=d.displayName;const R=({className:s,...e})=>a.jsx("div",{className:o("flex flex-col space-y-1.5 text-center sm:text-left",s),...e});R.displayName="DialogHeader";const z=({className:s,...e})=>a.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",s),...e});z.displayName="DialogFooter";const S=r.forwardRef(({className:s,...e},t)=>a.jsx(n,{ref:t,className:o("text-lg font-semibold leading-none tracking-tight",s),...e}));S.displayName=n.displayName;const C=r.forwardRef(({className:s,...e},t)=>a.jsx(c,{ref:t,className:o("text-sm text-muted-foreground",s),...e}));C.displayName=c.displayName;const k=r.forwardRef(({className:s,children:e,...t},l)=>a.jsxs(f,{ref:l,className:o("relative overflow-hidden",s),...t,children:[a.jsx(y,{className:"h-full w-full rounded-[inherit]",children:e}),a.jsx(x,{}),a.jsx(h,{})]}));k.displayName=f.displayName;const x=r.forwardRef(({className:s,orientation:e="vertical",...t},l)=>a.jsx(m,{ref:l,orientation:e,className:o("flex touch-none select-none transition-colors",e==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",e==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",s),...t,children:a.jsx(j,{className:"relative flex-1 rounded-full bg-border"})}));x.displayName=m.displayName;export{I as D,w as I,k as S,D as a,R as b,S as c,z as d};
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="/assets/index-BBNxXHaX.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-y1qudB0y.js"></script>
11
11
  <link rel="modulepreload" crossorigin href="/assets/react-vendor-DQ3p2tNP.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/ui-vendor-Btc0UVaC.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/terminal-CnuCQtKf.js">
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync } from 'node:fs';
1
+ import { existsSync, readFileSync, rmSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { spawn } from 'node:child_process';
@@ -31,6 +31,7 @@ Options:
31
31
  --no-open Do not open the browser after the server starts (default)
32
32
  --config <path> Path to the config file (default: ${DEFAULT_CONFIG_PATH})
33
33
  --cwd <path> Default working directory for new sessions
34
+ --reset-config Delete the selected local config file and exit
34
35
  --help, -h Show this help message
35
36
  --version, -v Show the current version
36
37
  `;
@@ -81,6 +82,11 @@ export function parseArgs(argv) {
81
82
  continue;
82
83
  }
83
84
 
85
+ if (arg === '--reset-config') {
86
+ options.resetConfig = true;
87
+ continue;
88
+ }
89
+
84
90
  if (arg === '--port' || arg.startsWith('--port=')) {
85
91
  const raw = arg.includes('=') ? arg.slice('--port='.length) : takeValue(arg, i++);
86
92
  const port = Number(raw);
@@ -115,6 +121,23 @@ export function parseArgs(argv) {
115
121
  return options;
116
122
  }
117
123
 
124
+ export function resetConfigFile(configPath = DEFAULT_CONFIG_PATH) {
125
+ const resolvedPath = path.resolve(configPath);
126
+
127
+ if (!existsSync(resolvedPath)) {
128
+ return {
129
+ removed: false,
130
+ configPath: resolvedPath,
131
+ };
132
+ }
133
+
134
+ rmSync(resolvedPath, { force: true });
135
+ return {
136
+ removed: true,
137
+ configPath: resolvedPath,
138
+ };
139
+ }
140
+
118
141
  export function openBrowser(url) {
119
142
  const platform = process.platform;
120
143
 
@@ -147,6 +170,16 @@ export async function main(argv = process.argv.slice(2)) {
147
170
  return;
148
171
  }
149
172
 
173
+ if (options.resetConfig) {
174
+ const result = resetConfigFile(options.configPath ?? DEFAULT_CONFIG_PATH);
175
+ console.log(
176
+ result.removed
177
+ ? `Deleted config file: ${result.configPath}`
178
+ : `Config file not found, nothing to reset: ${result.configPath}`,
179
+ );
180
+ return;
181
+ }
182
+
150
183
  if (!existsSync(SERVER_ENTRY)) {
151
184
  throw new Error('TermSpeak is not built yet. Run `npm run build` first.');
152
185
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promptmic",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Voice-first local UI for terminal-based AI coding assistants.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -1,5 +0,0 @@
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};