feat: OCI CLI Terminal, Spanish i18n, language in My Settings

Terminal:
- New /terminal page with Linux-style terminal UI (dark theme, title bar, prompt)
- OCI Config selector — isolated per user (ownership check)
- Tab autocomplete: parses oci --help dynamically, caches results, commands first
- Command history (↑/↓) persisted in DB per user
- Security: only 'oci' commands, blocks pipes/redirects/shell injection
- Built-in commands: clear, history, help
- Timeout 60s per command

i18n:
- Spanish (es.ts): 748+ keys, Latin American formal
- Language selector moved from sidebar to My Settings (🇧🇷/🇺🇸/🇪🇸)
- Auto-detect browser language (pt/es/en)

Backend:
- POST /api/terminal/execute — run OCI CLI with selected config
- GET /api/terminal/completions — dynamic autocomplete from oci --help
- GET /api/terminal/history — per-user command history
- terminal_history table in SQLite
This commit is contained in:
nogueiraguh
2026-04-01 17:45:25 -03:00
parent 62f2a3d1ab
commit 8caa032055
9 changed files with 1363 additions and 20 deletions

View File

@@ -20,6 +20,7 @@ const McpServersPage = lazy(() => import('@/pages/config/McpServersPage'));
const AdbConfigPage = lazy(() => import('@/pages/config/AdbConfigPage'));
const EmbeddingsPage = lazy(() => import('@/pages/config/EmbeddingsPage'));
const EmbConsultPage = lazy(() => import('@/pages/config/EmbConsultPage'));
const TerminalPage = lazy(() => import('@/pages/TerminalPage'));
const UsersPage = lazy(() => import('@/pages/admin/UsersPage'));
const MySettingsPage = lazy(() => import('@/pages/admin/MySettingsPage'));
const OracleIamPage = lazy(() => import('@/pages/admin/OracleIamPage'));
@@ -61,6 +62,7 @@ export default function App() {
<Route path="/explorer" element={<ExplorerPage />} />
<Route path="/oci-services" element={<OciServicesPage />} />
<Route path="/reports" element={<ReportsPage />} />
<Route path="/terminal" element={<TerminalPage />} />
<Route path="/config/oci" element={<OciConfigPage />} />
<Route path="/config/genai" element={<GenAiConfigPage />} />
<Route path="/config/mcp" element={<McpServersPage />} />