feat: LAD A-Team CIS Compliance Report, React SPA, i18n, report management, explorer UX fixes

- Professional Oracle-format compliance report with RAG remediation from ADB vector store
- React 19 SPA at /app/ (16 pages, TypeScript, Vite, Zustand, i18n pt/en 625 keys)
- Report delete endpoint, embed individual report files into vector store
- Terraform ZIP download (client-side, pure JS)
- Explorer silent polling during start/stop (no flickering)
- HTML report and compliance report sections start minimized
- Token auth fix for compliance report CSV download links
This commit is contained in:
nogueiraguh
2026-03-19 07:34:06 -03:00
parent baacc1ba21
commit 442e710b9f
60 changed files with 23094 additions and 13 deletions

View File

@@ -0,0 +1,666 @@
const en: Record<string, string> = {
// ── Sidebar ──
'nav.principal': 'Main',
'nav.config': 'Configuration',
'nav.admin': 'Administration',
'nav.chat': 'Chat Agent',
'nav.terraform': 'Terraform',
'nav.promptGen': 'Prompt Generator',
'nav.workspaces': 'Workspaces',
'nav.explorer': 'OCI Explorer',
'nav.reports': 'Reports',
'nav.ociCreds': 'OCI Credentials',
'nav.genai': 'GenAI Config',
'nav.mcp': 'MCP Servers',
'nav.adb': 'ADB Vector',
'nav.embeddings': 'Embeddings',
'nav.embConsult': 'Query Embeddings',
'nav.users': 'Users',
'nav.mfa': 'MFA',
'nav.audit': 'Audit Log',
'sidebar.lightMode': 'Light mode',
'sidebar.darkMode': 'Dark mode',
'sidebar.logout': 'Logout',
'sidebar.roleAdmin': 'Administrator',
'sidebar.roleUser': 'User',
'sidebar.subtitle': 'Infrastructure & Security',
// ── Login ──
'login.subtitle': 'Infrastructure & Security Engineer',
'login.userPlaceholder': 'Username',
'login.passPlaceholder': 'Password',
'login.mfaScanQr': 'Scan the QR code with your authenticator app:',
'login.totpPlaceholder': 'TOTP Code',
'login.loading': 'Signing in...',
'login.verify': 'Verify',
'login.submit': 'Sign in',
'login.error': 'Login failed',
// ── Chat ──
'chat.timeNow': 'now',
'chat.today': 'Today',
'chat.yesterday': 'Yesterday',
'chat.last7': 'Last 7 days',
'chat.last30': 'Last 30 days',
'chat.older': 'Older',
'chat.other': 'Other',
'chat.history': 'History',
'chat.newChat': 'New Chat',
'chat.untitled': 'Untitled',
'chat.noConversations': 'No conversations yet',
'chat.selectModel': 'Select a model...',
'chat.savedConfigs': 'Saved Configs',
'chat.searchModel': 'Search model...',
'chat.noModels': 'No models found',
'chat.ociCred': 'OCI Credential...',
'chat.settings': 'Settings',
'chat.newChatTitle': 'New chat',
'chat.emptyTitle': 'Start a conversation with the agent.',
'chat.emptySubtitle': 'Select a model to get started.',
'chat.thinking': 'Thinking...',
'chat.retry': 'Retry',
'chat.attachFile': 'Attach file',
'chat.placeholder': 'Type your message... (Shift+Enter for new line)',
'chat.send': 'Send',
'chat.selectOciCred': 'Select an OCI credential to use direct models.',
'chat.sendError': 'Failed to send message',
'chat.requestFailed': 'The request failed.',
'chat.timeout': 'Timeout: the response is taking too long. Try again.',
'chat.toolsAvailable': 'tools available',
'chat.ociCredLabel': 'OCI Credential',
'chat.select': 'Select...',
'chat.analyzeFiles': 'Analyze the attached files.',
// ── Terraform ──
'tf.history': 'History',
'tf.newChat': 'New',
'tf.noConversations': 'No conversations',
'tf.searchModel': 'Search model...',
'tf.selectModel': 'Select model...',
'tf.savedConfigs': 'Saved Configs',
'tf.ociConfig': 'OCI Config...',
'tf.settings': 'Settings',
'tf.newConversation': 'New conversation',
'tf.emptyTitle': 'Describe the OCI infrastructure',
'tf.emptySubtitle': 'The agent will generate Terraform code based on your description.',
'tf.thinking': 'Processing...',
'tf.retry': 'Retry',
'tf.placeholder': 'Describe the desired infrastructure... (Shift+Enter for new line)',
'tf.send': 'Send',
'tf.workspace': 'Workspace',
'tf.files': 'Files',
'tf.terminal': 'Terminal',
'tf.resources': 'Resources',
'tf.plan': 'Plan',
'tf.apply': 'Apply',
'tf.destroy': 'Destroy',
'tf.cancel': 'Cancel',
'tf.download': 'Download ZIP',
'tf.createWs': 'Create Workspace',
'tf.noFiles': 'No files generated',
'tf.timeout': 'Timeout: generation is taking too long.',
'tf.selectOci': 'Select an OCI credential',
'tf.compartment': 'Compartment',
'tf.region': 'Region',
'tf.rollback': 'Rollback',
'tf.copy': 'Copy',
'tf.copied': 'Copied',
'tf.noWs': 'No active workspace',
'tf.deleteWs': 'Delete',
// ── Prompt Generator ──
'pg.history': 'History',
'pg.new': 'New',
'pg.noConversations': 'No conversations',
'pg.emptyTitle': 'Describe the OCI infrastructure you need',
'pg.emptySubtitle': 'The agent will generate a structured, optimized prompt for the Terraform Agent.',
'pg.loading': 'Generating prompt...',
'pg.placeholder': 'Describe the desired infrastructure... (Shift+Enter for new line)',
'pg.copy': 'Copy',
'pg.copied': 'Copied',
'pg.retry': 'Retry',
'pg.timeout': 'Timeout: generation is taking too long.',
'pg.search': 'Search...',
'pg.selectModel': 'Select model...',
// ── Workspaces ──
'ws.title': 'Terraform Workspaces',
'ws.all': 'All',
'ws.active': 'Active',
'ws.draft': 'Draft',
'ws.failed': 'Failed',
'ws.destroyed': 'Destroyed',
'ws.loading': 'Loading...',
'ws.refresh': 'Refresh',
'ws.noWs': 'No workspaces found',
'ws.noWsHint': 'Create workspaces via the Terraform Agent',
'ws.loadingWs': 'Loading workspaces...',
'ws.open': 'Open',
'ws.plan': 'Plan',
'ws.apply': 'Apply',
'ws.destroy': 'Destroy',
'ws.delete': 'Delete',
'ws.cancel': 'Cancel',
'ws.hideOutput': 'hide',
'ws.viewOutput': 'view output',
'ws.confirmDestroy': 'Confirm Destroy',
'ws.confirmDestroyMsg': 'This action will destroy all resources provisioned by this workspace.',
'ws.typeDestroy': 'Type <strong>DESTROY</strong> to confirm:',
'ws.deleteWs': 'Delete Workspace',
'ws.deleteWsMsg': 'Delete this workspace permanently? Local files will be removed.',
'ws.noDate': 'No date',
// ── Explorer ──
'exp.title': 'OCI Explorer',
'exp.subtitle': 'Explore your Oracle Cloud Infrastructure resources',
'exp.search': 'Search resource...',
'exp.refresh': 'Refresh',
'exp.loading': 'Loading...',
'exp.noResources': 'No resources found',
'exp.selectResource': 'Select a resource type',
'exp.compartment': 'Compartment',
'exp.region': 'Region',
'exp.allRegions': 'All regions',
'exp.start': 'Start',
'exp.stop': 'Stop',
'exp.details': 'Details',
'exp.total': 'Total',
'exp.network': 'Network',
'exp.observability': 'Observability',
'exp.security': 'Security',
'exp.selectRegions': 'Select regions',
'exp.nRegions': '{0} regions',
'exp.all': 'All',
'exp.none': 'None',
'exp.noCompartment': 'No compartments found',
'exp.selectConfig': 'Select an OCI config',
'exp.loadingResources': 'Loading resources...',
'exp.clearFilter': 'Try clearing the search filter',
'exp.resources': 'resources',
'exp.updating': 'updating...',
'exp.regions': 'region(s)',
'exp.filter': 'Filter...',
'exp.startAction': 'Start',
'exp.stopAction': 'Stop',
'exp.updatingState': 'Updating...',
'exp.createdAt': 'Created at',
'exp.public': 'Public',
'exp.yesPublic': 'Yes',
'exp.noPrivate': 'No (private)',
'exp.freeTier': 'Free Tier',
'exp.yes': 'Yes',
'exp.no': 'No',
'exp.noRestrictions': 'No restrictions (open)',
'exp.updateNetworkAccess': 'Update Network Access',
'exp.accessUpdated': 'Access updated: ',
'exp.objects': 'Objects',
'exp.size': 'Size',
'exp.visibility': 'Visibility',
'exp.private': 'Private',
'exp.rules': 'Rules',
'exp.routes': 'Routes',
'exp.hideRules': 'Hide rules',
'exp.viewRules': 'View rules',
'exp.add': 'Add',
'exp.direction': 'Direction',
'exp.protocol': 'Protocol',
'exp.originDest': 'Source/Dest',
'exp.ports': 'Ports',
'exp.description': 'Description',
'exp.portMin': 'Port Min',
'exp.portMax': 'Port Max',
'exp.myIp': 'My IP',
'exp.save': 'Save',
'exp.cancel': 'Cancel',
'exp.ruleAdded': 'Rule added.',
'exp.enterCidr': 'Enter the CIDR.',
'exp.removeRule': 'Remove this rule?',
'exp.removeNsgRule': 'Remove this NSG rule?',
'exp.ipDetected': 'IP detected: {0} — adjust port and click Save',
'exp.ipDetectFailed': 'Could not detect IP.',
'exp.destination': 'Destination',
'exp.destType': 'Dest Type',
'exp.version': 'Version',
'exp.ha': 'HA',
// ── Reports ──
'rpt.title': 'CIS Reports',
'rpt.subtitle': 'Run CIS OCI Benchmark compliance scans',
'rpt.startScan': 'Start Scan',
'rpt.running': 'Running...',
'rpt.cancel': 'Cancel',
'rpt.tenancy': 'Tenancy',
'rpt.level': 'Level',
'rpt.region': 'Region',
'rpt.allRegions': 'All regions',
'rpt.noReports': 'No reports found',
'rpt.noReportsHint': 'Run a scan to generate compliance reports.',
'rpt.progress': 'Progress',
'rpt.completed': 'Completed',
'rpt.failed': 'Failed',
'rpt.viewReport': 'View Report',
'rpt.download': 'Download',
'rpt.delete': 'Delete',
'rpt.summary': 'Summary',
'rpt.passed': 'Passed',
'rpt.findings': 'Findings',
'rpt.recommendations': 'Recommendations',
'rpt.selectTenancy': 'Select a tenancy',
'rpt.selectCredential': 'Select a credential',
'rpt.loadingReports': 'Loading reports...',
'rpt.refresh': 'Refresh',
'rpt.pageTitle': 'CIS Reports',
'rpt.pageSubtitle': 'CIS Benchmark 3.0 — Compliance Scan & Dashboard',
'rpt.runScanCis': 'Run CIS Scan',
'rpt.inExecution': 'Running',
'rpt.configParams': 'Configure the parameters and run the CIS compliance scan.',
'rpt.ociCredential': 'OCI Credential',
'rpt.selectOciCred': 'Select OCI credential...',
'rpt.cisLevel': 'CIS Level',
'rpt.level1Desc': 'Essential security checks',
'rpt.level2Desc': 'Complete checks (includes Level 1)',
'rpt.regions': 'Regions',
'rpt.leaveEmpty': 'Leave empty to scan all subscribed regions',
'rpt.executeCompliance': 'Run CIS Compliance',
'rpt.scanProgress': 'Scan Progress',
'rpt.hideLog': 'Hide log',
'rpt.showLog': 'View full log',
'rpt.lines': 'lines',
'rpt.cancelScan': 'Cancel Scan',
'rpt.selectReport': 'Select Report',
'rpt.selectCompletedReport': 'Select a completed report...',
'rpt.searchTenancy': 'Search tenancy...',
'rpt.searchByTenancy': 'Search by tenancy...',
'rpt.noCredentials': 'No credentials found',
'rpt.allRegionsDefault': 'All regions (default)',
'rpt.searchRegion': 'Search region...',
'rpt.loadingDashboard': 'Loading dashboard...',
'rpt.complianceScore': 'Compliance Score',
'rpt.compliant': 'Compliant',
'rpt.nonCompliant': 'Non-Compliant',
'rpt.ofTotal': 'of total',
'rpt.compliantItems': 'compliant items',
'rpt.totalFindings': 'total findings',
'rpt.evaluated': 'Evaluated',
'rpt.controlsVerified': 'Controls verified',
'rpt.regionsCount': 'region(s)',
'rpt.complianceDist': 'Compliance Distribution',
'rpt.findingsBySection': 'Findings by Section',
'rpt.generatedAt': 'Generated at',
'rpt.htmlReport': 'HTML Report',
'rpt.files': 'Files',
'rpt.inSections': 'sections',
'rpt.fullEmbedding': 'Full Embedding',
'rpt.noActiveTables': 'No active tables',
'rpt.executionHistory': 'Execution History',
'rpt.reports': 'report(s)',
'rpt.loading': 'Loading...',
'rpt.firstScanHint': 'Run the first CIS scan above.',
'rpt.selected': 'Selected',
'rpt.deleteConfirm': 'Delete this report?',
'rpt.deleteFailed': 'Failed to delete',
'rpt.selectOciCredError': 'Select an OCI credential',
'rpt.alreadyRunning': 'A scan is already running',
'rpt.errorLoadReports': 'Error loading reports',
'rpt.errorStartScan': 'Error starting scan',
'rpt.selectAdb': 'Select an ADB connection.',
'rpt.selectTable': 'Select a table.',
'rpt.errorEmbedding': 'Error generating embedding',
'rpt.cancelled': 'Cancelled',
'rpt.completedAt': 'Completed:',
// ── Downloads ──
'dl.title': 'Downloads',
'dl.subtitle': 'Download generated CIS reports',
'dl.allTenancies': 'All Tenancies',
'dl.allSections': 'All sections',
'dl.reports': 'report(s)',
'dl.refresh': 'Refresh',
'dl.loadError': 'Error loading reports',
'dl.loading': 'Loading reports...',
'dl.noReports': 'No completed reports.',
'dl.noReportsHint': 'Run a scan in the Reports tab to generate reports.',
'dl.files': 'file(s)',
'dl.hide': 'Hide',
'dl.viewFiles': 'View Files',
'dl.loadingFiles': 'Loading files...',
'dl.noFiles': 'No files found',
'dl.filesInSections': 'file(s) in {0} sections',
// ── OCI Config ──
'oci.title': 'OCI Credentials',
'oci.subtitle': 'Manage Oracle Cloud Infrastructure credentials',
'oci.registered': 'Registered Credentials',
'oci.credential': 'credential',
'oci.credentials': 'credentials',
'oci.noCredentials': 'No credentials registered.',
'oci.edit': 'Edit',
'oci.test': 'Test',
'oci.delete': 'Delete',
'oci.yes': 'Yes',
'oci.no': 'No',
'oci.newCredential': 'New Credential',
'oci.editCredential': 'Edit Credential',
'oci.addDesc': 'Add your OCI account credentials to run reports and access services.',
'oci.editing': 'Editing:',
'oci.tenancyName': 'Tenancy Name',
'oci.ocidTenancy': 'OCID Tenancy',
'oci.region': 'Region',
'oci.selectRegion': 'Select region...',
'oci.searchRegion': 'Search region...',
'oci.noRegion': 'No regions found',
'oci.compartment': 'Compartment OCID',
'oci.ocidUser': 'OCID User',
'oci.fingerprint': 'Fingerprint',
'oci.sessionToken': 'Session Token',
'oci.sessionTokenHint': 'Paste the token file content generated by',
'oci.sessionKeyLabel': 'Session Key (.pem)',
'oci.privateKey': 'Private Key (.pem)',
'oci.publicKey': 'Public Key (.pem)',
'oci.keyPassphrase': 'Key Passphrase',
'oci.keyPassphraseHint': 'Only if the private key is password protected',
'oci.sshPublicKey': 'SSH Public Key',
'oci.sshPublicKeyHint': 'SSH key for compute instance access (e.g. ssh-rsa AAAA...)',
'oci.saveCredential': 'Save Credential',
'oci.saveChanges': 'Save Changes',
'oci.cancel': 'Cancel',
'oci.saving': 'Saving credential...',
'oci.saved': 'Credential saved successfully!',
'oci.updated': 'Credential updated successfully!',
'oci.deleting': 'Deleting credential...',
'oci.deleted': 'Credential deleted successfully!',
'oci.fillField': 'Fill in',
'oci.fillOcidTenancy': 'Fill in OCID Tenancy',
'oci.fillUserAndFP': 'Fill in OCID User and Fingerprint',
'oci.pasteToken': 'Paste the Session Token',
'oci.selectKey': 'Select the private key (.pem)',
'oci.selectSessionKey': 'Select the session key (.pem)',
'oci.changeHint': 'Fill to change. Current:',
'oci.keepKey': 'Leave empty to keep current key',
'oci.typeCannotChange': '(type cannot be changed)',
'oci.sshNotConfigured': 'not configured',
// ── GenAI Config ──
'genai.title': 'GenAI Models',
'genai.subtitle': 'Configure generative AI models for the Chat Agent',
'genai.configured': 'Configured Models',
'genai.model': 'model',
'genai.models': 'models',
'genai.noModels': 'No models configured.',
'genai.newModel': 'New GenAI Model',
'genai.editModel': 'Edit Model',
'genai.configName': 'Config Name',
'genai.ociCredential': 'OCI Credential',
'genai.modelSelect': 'Model',
'genai.genaiRegion': 'GenAI Region',
'genai.compartment': 'Compartment OCID',
'genai.modelOcid': 'Model OCID',
'genai.modelOcidHint': 'Paste the model OCID from OCI portal (optional)',
'genai.customOcid': 'Custom (use OCID)',
'genai.default': 'Default Model',
'genai.setDefault': 'Set as Default',
'genai.saveModel': 'Save Model',
'genai.saveChanges': 'Save Changes',
'genai.cancel': 'Cancel',
'genai.saving': 'Saving model...',
'genai.deleting': 'Deleting model...',
'genai.addDesc': 'Add custom models or create presets with specific credentials.',
'genai.fillName': 'Fill in config name',
'genai.selectOci': 'Select an OCI credential',
'genai.fillOcid': 'Enter Model OCID for custom model',
// ── MCP Servers ──
'mcp.title': 'MCP Servers',
'mcp.subtitle': 'MCP servers for tool integration and task execution',
'mcp.registered': 'Registered Servers',
'mcp.noServers': 'No MCP servers registered.',
'mcp.edit': 'Edit',
'mcp.activate': 'Activate',
'mcp.deactivate': 'Deactivate',
'mcp.active': 'Active',
'mcp.inactive': 'Inactive',
'mcp.delete': 'Delete',
'mcp.yes': 'Yes',
'mcp.no': 'No',
'mcp.command': 'Command:',
'mcp.url': 'URL:',
'mcp.module': 'Module:',
'mcp.adb': 'ADB:',
'mcp.noAdb': 'None',
'mcp.tools': 'Tools',
'mcp.noTools': 'No tools registered',
'mcp.discoverTools': 'Discover Tools',
'mcp.discovering': 'Connecting to MCP server to discover tools...',
'mcp.newServer': 'Register New Server',
'mcp.editServer': 'Edit Server',
'mcp.name': 'Name',
'mcp.description': 'Description',
'mcp.serverType': 'Server Type',
'mcp.commandLabel': 'Command',
'mcp.commandHint': 'Command to start the server',
'mcp.argsLabel': 'Arguments (JSON)',
'mcp.argsHint': 'Array of arguments passed to the command',
'mcp.urlLabel': 'Server URL',
'mcp.urlHint': 'MCP server SSE endpoint',
'mcp.linkAdb': 'Link ADB Vector',
'mcp.linkAdbHint': 'Optional — the MCP server can use this database as a tool.',
'mcp.saveServer': 'Register Server',
'mcp.saveChanges': 'Save Changes',
'mcp.cancel': 'Cancel',
'mcp.saving': 'Registering server...',
'mcp.updating': 'Updating server...',
'mcp.fillName': 'Fill in server name',
'mcp.invalidArgs': 'Arguments must be a valid JSON array',
'mcp.configDesc': 'Configure a new MCP server. Fields adjust based on the selected type.',
// ── ADB Config ──
'adb.title': 'ADB Connections',
'adb.subtitle': 'Oracle Autonomous Database connections via Wallet (mTLS)',
'adb.registered': 'Registered Connections',
'adb.connection': 'connection',
'adb.connections': 'connections',
'adb.noConnections': 'No ADB connections registered.',
'adb.edit': 'Edit',
'adb.test': 'Test',
'adb.delete': 'Delete',
'adb.yes': 'Yes',
'adb.no': 'No',
'adb.newConnection': 'New Connection',
'adb.editConnection': 'Edit Connection',
'adb.connName': 'Connection Name',
'adb.walletZip': 'Wallet ZIP',
'adb.walletHint': 'Upload wallet to extract DSNs from tnsnames.ora',
'adb.walletEditHint': 'Upload new wallet or leave empty to keep current',
'adb.analyze': 'Analyze',
'adb.dsn': 'DSN (TNS Name)',
'adb.dsnHint': 'Select or type the DSN. E.g. myatp_high',
'adb.username': 'Username',
'adb.password': 'Password',
'adb.walletPassword': 'Wallet Password',
'adb.genaiConfig': 'GenAI Config (Embeddings)',
'adb.genaiConfigHint': 'OCI credentials used to generate embeddings via GenAI.',
'adb.noRag': 'None (no RAG)',
'adb.embeddingModel': 'Embedding Model',
'adb.embeddingModelHint': 'OCI GenAI model to generate vectors.',
'adb.saveConnection': 'Save Connection',
'adb.saveChanges': 'Save Changes',
'adb.cancel': 'Cancel',
'adb.saving': 'Saving connection...',
'adb.deleting': 'Deleting connection...',
'adb.updateWallet': 'Update Wallet',
'adb.adbConnection': 'ADB Connection',
'adb.uploadWallet': 'Upload Wallet',
'adb.connDesc': 'Connection via python-oracledb Thin mode with Wallet (mTLS) to Oracle Autonomous Database.',
'adb.selectWallet': 'Select a wallet ZIP file.',
'adb.selectConnection': 'Select an ADB connection.',
'adb.fillName': 'Fill in connection name',
'adb.fillDsn': 'Fill in DSN',
'adb.fillUsername': 'Fill in username',
'adb.fillPassword': 'Fill in password',
// ── Embeddings ──
'emb.title': 'Embeddings',
'emb.subtitle': 'Vector knowledge base — upload, import and management',
'emb.noAdb': 'No ADB connection configured.',
'emb.noAdbHint': 'Configure in ADB Vector.',
'emb.noOci': 'No OCI credential configured.',
'emb.noOciHint': 'Configure in Config → OCI.',
'emb.existing': 'Existing Embeddings',
'emb.existingDesc': 'Query documents stored in ADB embedding tables.',
'emb.adbConnection': 'ADB Connection',
'emb.table': 'Table',
'emb.load': 'Load',
'emb.noEmbeddings': 'No embeddings found.',
'emb.total': 'Total: {0} documents',
'emb.cisTitle': 'CIS Recommendations',
'emb.cisDesc': 'Upload the latest PDF version to keep CIS Oracle Cloud recommendations updated in the vector database.',
'emb.pdfFile': 'PDF File',
'emb.uploadCis': 'Upload CIS Recommendations',
'emb.kbTitle': 'Knowledge Base',
'emb.kbDesc': 'Upload documents to feed the team knowledge base. Files will be vectorized and available for chat queries.',
'emb.fileLabel': 'File (.txt, .pdf, .csv, .json, .md)',
'emb.uploadFile': 'Upload File',
'emb.urlLabel': 'URL (web page or PDF)',
'emb.importUrl': 'Import URL',
'emb.purgeTitle': 'Purge & Re-embed',
'emb.purgeDesc': 'Clear embeddings from a table to free space or prepare for re-ingestion. This action is irreversible.',
'emb.tenancyOptional': 'Tenancy (optional)',
'emb.purge': 'Purge',
'emb.confirm': 'Confirm',
'emb.selectTable': 'Select a table.',
'emb.selectAdbAndFile': 'Select ADB connection and file.',
'emb.selectAdbAndUrl': 'Select ADB connection and enter URL.',
'emb.processing': 'Processing PDF and generating embeddings...',
'emb.uploading': 'Uploading and generating embeddings...',
'emb.fetchingUrl': 'Fetching content and generating embeddings...',
'emb.purging': 'Clearing embeddings...',
// ── EmbConsult ──
'ec.title': 'Query Embeddings',
'ec.subtitle': 'Ask about data stored in vector databases',
'ec.clear': 'Clear',
'ec.tableOptional': 'Table (optional)',
'ec.allTables': 'All tables',
'ec.emptyTitle': 'Make a query to search embeddings.',
'ec.emptyHint': 'E.g. "findings for CIS 1.1", "networking recommendations", "how to fix MFA"',
'ec.searching': 'Querying vector databases...',
'ec.placeholder': 'Type your query...',
'ec.submit': 'Query',
'ec.sources': 'Consulted sources',
'ec.noAnswer': 'No model response.',
// ── Users ──
'usr.title': 'Users',
'usr.activeCount': 'active',
'usr.activesCount': 'active',
'usr.inactiveCount': 'inactive',
'usr.inactivesCount': 'inactive',
'usr.total': 'total',
'usr.newUser': 'New User',
'usr.cancel': 'Cancel',
'usr.createUser': 'Create New User',
'usr.firstName': 'First Name',
'usr.lastName': 'Last Name',
'usr.username': 'Username',
'usr.email': 'Email',
'usr.password': 'Password',
'usr.role': 'Role',
'usr.creating': 'Creating...',
'usr.create': 'Create User',
'usr.noUsers': 'No users registered',
'usr.noUsersHint': 'Click "New User" to create the first user.',
'usr.name': 'Name',
'usr.mfa': 'MFA',
'usr.status': 'Status',
'usr.lastLogin': 'Last Login',
'usr.actions': 'Actions',
'usr.active': 'Active',
'usr.inactive': 'Inactive',
'usr.never': 'Never',
'usr.confirm': 'Confirm',
'usr.deactivate': 'Deactivate user',
'usr.created': 'User created successfully!',
'usr.roleUpdated': 'Role updated',
'usr.deactivated': 'User deactivated',
'usr.requiredName': 'First and last name are required',
'usr.requiredUsername': 'Username is required',
'usr.requiredPassword': 'Password is required',
// ── MFA ──
'mfa.title': 'MFA Authentication (TOTP)',
'mfa.subtitle': 'Protect your account with two-factor authentication via Google Authenticator or Authy.',
'mfa.enabled': 'MFA is enabled',
'mfa.disabled': 'MFA is disabled',
'mfa.enabledDesc': 'Your account is protected with two-factor authentication.',
'mfa.disabledDesc': 'Enable MFA to add an extra layer of security.',
'mfa.disableHint': 'To disable MFA, click the button below. This will reduce your account security.',
'mfa.disableBtn': 'Disable MFA',
'mfa.confirmDisable': 'Are you sure you want to disable MFA for your account?',
'mfa.scanQr': 'Scan the QR Code or copy the secret',
'mfa.openApp': 'Open your authenticator app (Google Authenticator, Authy, etc.)',
'mfa.enterCode': 'Enter the code from your app',
'mfa.activateMfa': 'Activate MFA',
'mfa.generateSecret': 'Generate Secret',
'mfa.generateHint': 'Click the button below to generate a TOTP secret. You will need an authenticator app to scan the QR Code.',
'mfa.activated': 'MFA activated successfully!',
'mfa.deactivated': 'MFA deactivated.',
'mfa.invalidCode': 'Enter a 6-digit code',
// ── Audit ──
'audit.title': 'Audit Log',
'audit.subtitle': 'System activity monitoring, configurations and chat sessions.',
'audit.tabAudit': 'Audit Log',
'audit.tabConfig': 'Config Logs',
'audit.tabChat': 'Chat Logs',
'audit.records': 'records',
'audit.refresh': 'Refresh',
'audit.all': 'All',
'audit.errors': 'Errors',
'audit.success': 'Success',
'audit.info': 'Info',
'audit.loadingLogs': 'Loading logs...',
'audit.noAudit': 'No audit records.',
'audit.noConfig': 'No configuration logs recorded.',
'audit.noChat': 'No chat logs recorded.',
'audit.date': 'Date',
'audit.user': 'User',
'audit.action': 'Action',
'audit.resource': 'Resource',
'audit.details': 'Details',
'audit.ip': 'IP',
'audit.config': 'Config',
'audit.status': 'Status',
'audit.message': 'Message',
'audit.session': 'Session',
'audit.source': 'Source',
// ── Common ──
'common.save': 'Save',
'common.cancel': 'Cancel',
'common.delete': 'Delete',
'common.edit': 'Edit',
'common.create': 'Create',
'common.update': 'Refresh',
'common.close': 'Close',
'common.confirm': 'Confirm',
'common.back': 'Back',
'common.search': 'Search',
'common.refresh': 'Refresh',
'common.download': 'Download',
'common.upload': 'Upload',
'common.copy': 'Copy',
'common.retry': 'Retry',
'common.send': 'Send',
'common.clear': 'Clear',
'common.test': 'Test',
'common.yes': 'Yes',
'common.no': 'No',
'common.loading': 'Loading...',
'common.saving': 'Saving...',
'common.select': 'Select...',
'common.noData': 'No data found',
'common.error': 'Error',
'common.success': 'Success',
};
export default en;