@realtimex/email-automator 2.22.1 → 2.22.3
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/api/src/lib/setup-knowledge.generated.ts +2 -1
- package/api/src/routes/agent.ts +1 -0
- package/api/src/services/AgentService.ts +3 -4
- package/api/src/services/RAGService.ts +26 -3
- package/dist/api/src/lib/setup-knowledge.generated.js +2 -1
- package/dist/api/src/routes/agent.js +1 -0
- package/dist/api/src/services/AgentService.js +2 -4
- package/dist/api/src/services/RAGService.js +23 -4
- package/dist/assets/es-NQpkAluz.js +49 -0
- package/dist/assets/fr-Dt1serdG.js +49 -0
- package/dist/assets/{index-y96M9yNt.js → index-CVXILfer.js} +51 -41
- package/dist/assets/ja-46nRzsm5.js +49 -0
- package/dist/assets/ko-DUNCzc8F.js +49 -0
- package/dist/assets/vi-CA9x3uPA.js +49 -0
- package/dist/index.html +1 -1
- package/docs/README.md +9 -18
- package/docs/en/README.md +23 -0
- package/docs/{marketplace → en/marketplace}/listing.md +1 -1
- package/docs/{user-guide → en/user-guide}/GETTING-STARTED.md +2 -1
- package/docs/en/user-guide/GLOSSARY.md +163 -0
- package/docs/es/README.md +23 -0
- package/docs/es/marketplace/listing.md +34 -0
- package/docs/es/user-guide/ACCOUNT.md +52 -0
- package/docs/es/user-guide/AUTOMATION.md +93 -0
- package/docs/es/user-guide/CONFIGURATION.md +61 -0
- package/docs/es/user-guide/DASHBOARD.md +71 -0
- package/docs/es/user-guide/GETTING-STARTED.md +61 -0
- package/docs/es/user-guide/GLOSSARY.md +160 -0
- package/docs/es/user-guide/TROUBLESHOOTING.md +65 -0
- package/docs/fr/README.md +23 -0
- package/docs/fr/marketplace/listing.md +34 -0
- package/docs/fr/user-guide/ACCOUNT.md +52 -0
- package/docs/fr/user-guide/AUTOMATION.md +93 -0
- package/docs/fr/user-guide/CONFIGURATION.md +61 -0
- package/docs/fr/user-guide/DASHBOARD.md +71 -0
- package/docs/fr/user-guide/GETTING-STARTED.md +61 -0
- package/docs/fr/user-guide/GLOSSARY.md +160 -0
- package/docs/fr/user-guide/TROUBLESHOOTING.md +65 -0
- package/docs/ja/README.md +23 -0
- package/docs/ja/marketplace/listing.md +34 -0
- package/docs/ja/user-guide/ACCOUNT.md +52 -0
- package/docs/ja/user-guide/AUTOMATION.md +93 -0
- package/docs/ja/user-guide/CONFIGURATION.md +61 -0
- package/docs/ja/user-guide/DASHBOARD.md +71 -0
- package/docs/ja/user-guide/GETTING-STARTED.md +61 -0
- package/docs/ja/user-guide/GLOSSARY.md +160 -0
- package/docs/ja/user-guide/TROUBLESHOOTING.md +65 -0
- package/docs/ko/README.md +23 -0
- package/docs/ko/marketplace/listing.md +34 -0
- package/docs/ko/user-guide/ACCOUNT.md +52 -0
- package/docs/ko/user-guide/AUTOMATION.md +93 -0
- package/docs/ko/user-guide/CONFIGURATION.md +61 -0
- package/docs/ko/user-guide/DASHBOARD.md +71 -0
- package/docs/ko/user-guide/GETTING-STARTED.md +61 -0
- package/docs/ko/user-guide/GLOSSARY.md +160 -0
- package/docs/ko/user-guide/TROUBLESHOOTING.md +65 -0
- package/docs/vi/README.md +23 -0
- package/docs/vi/marketplace/listing.md +34 -0
- package/docs/vi/user-guide/ACCOUNT.md +52 -0
- package/docs/vi/user-guide/AUTOMATION.md +93 -0
- package/docs/vi/user-guide/CONFIGURATION.md +61 -0
- package/docs/vi/user-guide/DASHBOARD.md +71 -0
- package/docs/vi/user-guide/GETTING-STARTED.md +61 -0
- package/docs/vi/user-guide/GLOSSARY.md +160 -0
- package/docs/vi/user-guide/TROUBLESHOOTING.md +65 -0
- package/package.json +1 -1
- package/scripts/build-setup-knowledge.ts +1 -1
- package/scripts/ingest-knowledge-rag.ts +42 -26
- package/supabase/migrations/20260203150000_add_lang_to_knowledge_chunks.sql +49 -0
- package/dist/assets/es-BySeIenb.js +0 -4
- package/dist/assets/fr-Cj4xUTOj.js +0 -4
- package/dist/assets/ja-DeBZHkY-.js +0 -4
- package/dist/assets/ko-CHMiWHbo.js +0 -4
- package/dist/assets/vi-B4Rp8hRI.js +0 -4
- /package/docs/{user-guide → en/user-guide}/ACCOUNT.md +0 -0
- /package/docs/{user-guide → en/user-guide}/AUTOMATION.md +0 -0
- /package/docs/{user-guide → en/user-guide}/CONFIGURATION.md +0 -0
- /package/docs/{user-guide → en/user-guide}/DASHBOARD.md +0 -0
- /package/docs/{user-guide → en/user-guide}/TROUBLESHOOTING.md +0 -0
|
@@ -6,6 +6,7 @@ export const SETUP_KNOWLEDGE: Record<string, string> = {
|
|
|
6
6
|
"AUTOMATION.md": "# Automation & Auto-Pilot\n\nThe **Auto-Pilot** tab is the central hub for managing your AI agent's behavior. It consolidates \"System Rules\" (global toggles) and a library of **26 built-in intelligent rules** alongside your own \"Custom Rules.\"\n\n---\n\n## 🛡️ Built-in System Rules\n\nEmail Automator comes with 26 pre-configured rules designed by AI experts to handle common inbox challenges. These are organized into functional categories to help you stay organized.\n\n### 📧 Email Organization\n* **Newsletter Sweeper**: Auto-archives newsletters and marketing emails to keep your inbox clean.\n* **Receipt Organizer**: Automatically files receipts and order confirmations.\n* **CC Organizer**: Labels emails where you are CC'd for quick triage.\n* **Cold Outreach Filter**: Moves cold sales emails to a separate folder.\n* **Social Noise**: Minimizes LinkedIn and social network notifications.\n* **Stack Overflow Digests**: Auto-archives technical digests unless they require immediate attention.\n\n### 🚨 Priority & Alerts\n* **VIP Urgent Messages**: Stars urgent messages from key stakeholders (CEOs, Board members).\n* **Critical Alerts**: Surfaces production incidents and P0/P1 critical alerts.\n* **Urgent Support Tickets**: Highlights high-priority customer issues needing immediate action.\n\n### 💻 Development\n* **GitHub Mentions**: Tracks when you are specifically mentioned in Pull Requests or Issues.\n* **CI/CD Failures**: Highlights build and deployment failures from tools like CircleCI or GitHub Actions.\n* **Code Review Requests**: Organizes incoming requests for code reviews.\n* **Dependabot Noise**: Auto-archives low-priority dependency updates while keeping security alerts visible.\n* **Monitoring Alerts**: Organizes non-urgent monitoring and logging alerts.\n\n### 💼 Sales & Business\n* **Hot Leads**: Prioritizes high-intent prospect replies based on positive sentiment.\n* **Follow-up Reminders**: Tracks prospect responses that specifically request a follow-up.\n* **Referrals & Intros**: Ensures you never miss a warm introduction or referral.\n* **Contracts & Proposals**: Highlights important contract communications and legal documents.\n* **Objections & Concerns**: Flags emails expressing concerns or hesitation for careful handling.\n* **Nurture Campaigns**: Archives automated drip campaign emails to prioritize personal replies.\n* **Financial Updates**: Keeps revenue reports and quarterly budget updates easily accessible.\n\n### ⚙️ Operations\n* **Internal Requests**: Organizes cross-team requests and action items.\n* **Vendor Communications**: Tracks invoices, shipments, and vendor-related updates.\n* **System Alerts**: Organizes infrastructure and system notifications.\n* **Meeting Invites**: Separates calendar invites for easier scheduling management.\n* **Weekly Reports**: Auto-files regular status reports and progress updates.\n\n---\n\n## 🛠️ Building Custom Rules\n\nCustom rules allow you to create precise, AI-driven workflows. You can create, edit, and manage these directly within the **Auto-Pilot** tab.\n\n### 1. Conditions (The \"If\")\nYou can mix and match metadata and AI-powered conditions:\n* **AI Insights**: Category (e.g., Newsletter, Receipt, Personal), Sentiment (Positive, Negative, Neutral), or Priority (High, Medium, Low).\n* **Metadata**: Sender domain (e.g., `github.com`), specific keywords in the subject, or sender's name.\n* **Retention Filter**: \"Only act if the email is older than X days.\" This is perfect for cleaning up old newsletters or notifications.\n\n### 2. Actions (The \"Then\")\nChoose what happens when an email matches your conditions:\n* **Archive / Delete**: Keep your inbox clean automatically.\n* **Star / Flag**: Highlight important items for manual review.\n* **Draft**: The most powerful action. It tells the AI to prepare a reply.\n\n---\n\n## ✍️ Smart Context & Ghostwriting\n\nWhen you use the **Draft** action, you can provide the AI with specific instructions to ensure the reply matches your needs:\n\n* **Ghostwriting Instructions**: Tell the AI *how* to reply (e.g., \"Be polite but firm in declining the invitation,\" or \"Ask for their availability next Tuesday\").\n* **Rule Attachments**: You can upload standard documents (like a pricing sheet or a bio) that the AI will automatically include as attachments whenever this rule triggers a draft.\n\n---\n\n## 🚀 The Auto-Pilot Tab\n\nThe **Auto-Pilot** tab provides a bird's-eye view of your automation engine.\n* **Grouped View**: Rules are organized by their primary intent.\n* **Quick Toggles**: Enable or disable rules instantly without deleting them.\n* **Status Indicators**: See which rules are currently active and how many emails they've processed.\n\n---\n\n## 💡 Best Practices\n\n* **Start Passive**: Set your first rules to **Star** or **Archive** instead of **Delete** until you are confident in the AI's categorization.\n* **Use Retention for Noise**: Use a rule like: `If Category = Newsletter AND Age > 30 Days THEN Delete`. This keeps your \"read\" newsletters from cluttering your archive forever.\n* **Refine with Feedback**: If a rule isn't matching correctly, use the **Feedback** icon on the Dashboard to improve the AI's understanding of that specific email type.\n\n---\n\n**Next Step:** [Account & Security Management](./ACCOUNT.md)\n",
|
|
7
7
|
"CONFIGURATION.md": "# Configuration\n\nThe **Configuration** tab is the command center of Email Automator. Here, you connect your email providers, define your AI's behavior, and set up the rules that drive automation.\n\n---\n\n## 📧 Email Accounts (BYOK)\n\nEmail Automator follows a **\"Bring Your Own Key\" (BYOK)** model. You provide your own OAuth credentials, ensuring that your data access remains entirely under your control.\n\n### 🔴 Gmail Setup (OAuth 2.0)\n1. **Google Cloud Console**: Create a project and enable the **Gmail API**.\n2. **Consent Screen**: Configure the OAuth consent screen and add your email as a **Test User**.\n3. **Credentials**: Create an **OAuth 2.0 Client ID** (Type: Web Application).\n * **Authorized Redirect URI**: `https://<your-project-ref>.supabase.co/functions/v1/auth-gmail/callback`\n4. **Connect**: In Email Automator, click **Connect Gmail**.\n5. **Authorize**: Paste your Client ID and Secret (or upload the JSON), then follow the link to authorize your account.\n\n### 🔵 Outlook Setup (Device Code)\n1. **Azure Portal**: Register a new application in **App Registrations**.\n2. **Account Type**: Select \"Accounts in any organizational directory and personal Microsoft accounts\".\n3. **Authentication**: Ensure \"Allow public client flows\" is set to **Yes**.\n4. **Connect**: In Email Automator, click **Connect Outlook** and enter your **Client ID**.\n5. **Authorize**: Follow the **Device Code** prompt in your browser to complete the sign-in.\n\n---\n\n## 📅 Sync Scope & Limits\n\nBefore starting your first sync, configure the boundaries to ensure performance and cost-efficiency:\n\n* **Sync From**: Choose the starting date (e.g., \"From Now\" or a specific historical date).\n* **Max Emails**: Set the maximum number of emails to process in a single batch (Default: 50).\n* **Sync Interval**: Define how often the background scheduler should check for new mail (e.g., every 15 minutes).\n\n> [!TIP]\n> **Start Small**: For your first run, we recommend setting \"Sync From\" to \"Now\" and \"Max Emails\" to 10-20 to verify your rules are working as expected.\n\n---\n\n## 🤖 Automation & Auto-Pilot\n\nManagement of your AI's behavior—including building custom rules, toggling system automations, and setting retention policies—has been consolidated into the **[Auto-Pilot](./AUTOMATION.md)** tab.\n\n---\n\n## 🧠 AI & System Settings\n\n### Provider Configuration\nEmail Automator detects available models via **RealTimeX Desktop**.\n* **LLM Provider**: Choose your preferred AI engine (e.g., OpenAI, Anthropic, or local models).\n* **Embedding Model**: Used for the RAG (Retrieval-Augmented Generation) system to help the AI understand your specific context.\n\n### Voice & Accessibility (TTS)\nEnable **Text-to-Speech** to have the AI read summaries or important alerts aloud.\n* **Auto-Speak**: Automatically read high-priority notifications.\n* **Voice Profile**: Choose from various high-quality voices available through RealTimeX.\n\n---\n\n**Next Step:** [Monitoring the Dashboard](./DASHBOARD.md)\n",
|
|
8
8
|
"DASHBOARD.md": "# Dashboard & Live Activity\n\nThe **Dashboard** is your primary interface for monitoring your AI agent’s activity and managing your analyzed inbox. It is designed to provide complete transparency into how the AI thinks and acts.\n\n---\n\n## 📊 The Analysis Feed\n\nAs the AI processes your inbox, emails appear in the feed with real-time status updates and intelligent insights.\n\n* **Smart Search**: Quickly find emails by keyword or sender.\n* **AI Filters**: Filter your view by Category (e.g., Newsletter, Personal), Sentiment, or Priority.\n* **Dynamic Sorting**: Toggle between the time an email was *received* and the time it was *processed* by the AI.\n\n### 📌 Email Detail Sidebar\nClicking any email card opens a detailed side panel containing:\n* **AI Summary**: A concise overview of the email's content.\n* **Key Points**: Bulleted highlights extracted by the AI.\n* **Draft Preview**: If a draft reply was generated, you can review it here before it's sent.\n* **Quick Links**: Jump directly to the original email in your Gmail or Outlook web interface.\n\n---\n\n## 🛡️ Trust & Transparency\n\nEmail Automator is built on the principle of **\"Glass Box AI.\"** You should always know *why* an action was taken.\n\n### 📟 Live Activity Terminal\nClick the **Live Activity** button in the bottom-right corner to open the real-time processing feed.\n* **Thinking Logs**: Watch the AI analyze content, evaluate rules, and decide on actions.\n* **Technical Details**: See raw API calls, processing durations, and background sync statuses.\n* **Control**: You can manually stop an active sync directly from the terminal.\n\n### 🕵️ AI Trace\nClick the **Eye icon** on any email card to open the **AI Trace Modal**.\n* **Decision Logic**: View a step-by-step breakdown of why the AI assigned a specific category or priority.\n* **Raw Data**: See the exact prompt sent to the LLM and the raw JSON response it returned.\n* **Performance Stats**: Review token usage and processing time for that specific email.\n\n---\n\n## ⚡ Quick Actions\n\nTake control with one-click actions available on every email card:\n* 🗑️ **Delete / 📦 Archive**: Instant cleanup.\n* ⭐ **Star / Flag**: Mark important items for later.\n* 🔄 **Reprocess**: If you’ve updated your rules, you can ask the AI to analyze an email again.\n* 💬 **Feedback**: Help the AI learn by reporting incorrect categorizations or sentiment analysis.\n\n---\n\n## 🔔 Notifications & Feedback\n\nThe app uses multi-sensory feedback to keep you informed of background activity:\n* **Visual**: Live status badges and toast notifications.\n* **Audio**: Subtle, high-quality chimes for new emails, high-priority alerts, and sync completion.\n* **Haptic**: Physical feedback on supported devices.\n\n> **Note**: Sound and Haptic settings can be customized in [**Account Settings**](./ACCOUNT.md).\n\n---\n\n## 📈 Analytics & History\n\nStay informed about your agent's performance:\n* **Sync History**: View a log of recent sync runs, including the number of emails processed and any actions taken.\n* **Efficiency Stats**: See totals for automated deletions, archives, and drafts over time.\n\n---\n\n**Next Step:** [Creating Automation Rules](./AUTOMATION.md)\n",
|
|
9
|
-
"GETTING-STARTED.md": "# Getting Started\n\nWelcome to **Email Automator**, your AI-powered personal email assistant. This guide will help you set up the application using the **\"Bring Your Own Key\" (BYOK)** model, which ensures your data remains under your control within your own Supabase infrastructure.\n\n## 🛠 Prerequisites\n\nBefore you begin, ensure you have the following:\n\n1. **RealTimeX Desktop**: Installed and running. This is required for AI processing (LLMs) and Text-to-Speech (TTS) capabilities.\n2. **Supabase Account**: A free or paid account at [supabase.com](https://supabase.com).\n\n---\n\n## 🚀 Quick Setup with the Wizard\n\nThe built-in **Setup Wizard** is the recommended way to get started. It automates the technical heavy lifting.\n\n### 1. Purchase & Launch\n* Open **RealTimeX Desktop**.\n* Go to the **Marketplace** tab → **Local Apps**.\n* Search for **\"Email Automator\"** and purchase it (or activate if already owned).\n* Once purchased, click **Launch** from your Local Apps list.\n\n### 2. Run the Setup Wizard\nUpon first launch, the app will guide you through the initial configuration:\n\n* **Choose a Setup Path**:\n * **Managed Provisioning (Recommended)**: Provide a **Supabase Access Token**. The wizard will automatically create a new project, run database migrations, deploy Edge Functions, and ingest the initial knowledge base.\n * **Connect Existing Project**: Use an existing Supabase project by providing your **Project URL** and **Anon Key**. You can optionally provide an Access Token here to have the wizard run migrations for you.\n\n### 3. Create Your Account\nOnce the database is ready, you will be prompted to create your local user account and sign in to access the **Dashboard**.\n\n---\n\n## 🔍 Finding Your Supabase Credentials\n\nIf you choose to connect an existing project manually, you can find your credentials in the [Supabase Dashboard](https://supabase.com/dashboard):\n\n1. Select your project.\n2. Navigate to **Settings** → **API**.\n3. **Project URL**: Copy the URL found under \"Project URL\".\n4. **API Key**: Copy the **anon (public)** key under \"Project API keys\".\n\n> [!WARNING]\n> **Security Note**: Never use the `service_role` key. It has full administrative bypass privileges and should never be exposed in client-side applications.\n\n---\n\n## 🪪 Generating an Access Token\n\nAn Access Token allows the Setup Wizard to manage your Supabase projects (creation, migrations, function deployment) on your behalf.\n\n1. In your Supabase Dashboard, go to **Account** → **Access Tokens**.\n2. Click **Generate new token**, give it a name (e.g., \"Email Automator\"), and copy the result.\n3. Paste this token into the Setup Wizard when prompted.\n\n---\n\n**Next Step:** [Configure your Email Accounts](./CONFIGURATION.md)\n",
|
|
9
|
+
"GETTING-STARTED.md": "# Getting Started\n\nWelcome to **Email Automator**, your AI-powered personal email assistant. This guide will help you set up the application using the **\"Bring Your Own Key\" (BYOK)** model, which ensures your data remains under your control within your own Supabase infrastructure.\n\n## 🛠 Prerequisites\n\nBefore you begin, ensure you have the following:\n\n1. **RealTimeX Desktop**: Installed and running. This is required for AI processing (LLMs) and Text-to-Speech (TTS) capabilities.\n2. **Supabase Account**: A free or paid account at [supabase.com](https://supabase.com).\n\n---\n\n## 🚀 Quick Setup with the Wizard\n\nThe built-in **Setup Wizard** is the recommended way to get started. It automates the technical heavy lifting.\n\n### 1. Purchase & Launch\n* Open **RealTimeX Desktop**.\n* Go to the **Marketplace** tab → **Local Apps**.\n* Search for **\"Email Automator\"** and purchase it (or activate if already owned).\n* Once purchased, click **Launch** from your Local Apps list.\n\n### 2. Run the Setup Wizard\nUpon first launch, the app will guide you through the initial configuration:\n\n* **Choose a Setup Path**:\n * **Managed Provisioning (Recommended)**: Provide a **Supabase Access Token**. The wizard will automatically create a new project, run database migrations, deploy Edge Functions, and ingest the initial knowledge base.\n * **Connect Existing Project**: Use an existing Supabase project by providing your **Project URL** and **Anon Key**. You can optionally provide an Access Token here to have the wizard run migrations for you.\n\n### 3. Create Your Account\nOnce the database is ready, you will be prompted to create your local user account and sign in to access the **Dashboard**.\n\n---\n\n## 🔍 Finding Your Supabase Credentials\n\nIf you choose to connect an existing project manually, you can find your credentials in the [Supabase Dashboard](https://supabase.com/dashboard):\n\n1. Select your project.\n2. Navigate to **Settings** → **API**.\n3. **Project URL**: Copy the URL found under \"Project URL\".\n4. **API Key**: Copy the **anon (public)** key under \"Project API keys\".\n\n> [!WARNING]\n> **Security Note**: Never use the `service_role` key. It has full administrative bypass privileges and should never be exposed in client-side applications.\n\n---\n\n## 🪪 Generating an Access Token\n\nAn Access Token allows the Setup Wizard to manage your Supabase projects (creation, migrations, function deployment) on your behalf.\n\n1. In your Supabase Dashboard, go to **Account** → **Access Tokens**.\n2. Click **Generate new token**, give it a name (e.g., \"Email Automator\"), and copy the result.\n3. Paste this token into the Setup Wizard when prompted.\n\n---\n\n**Next Step:** [Configure your Email Accounts](./CONFIGURATION.md) \n**Glossary:** [Common Terms](./GLOSSARY.md)\n",
|
|
10
|
+
"GLOSSARY.md": "# Glossary\n\nDefinitions of common terms used in Email Automator and the Setup Wizard.\n\n## Supabase\nA backend platform that provides a hosted Postgres database, authentication, storage, and APIs. Email Automator uses Supabase as its database and auth layer.\n\n## BYOK (Bring Your Own Key)\nA setup model where you connect your own Supabase project instead of using a shared backend. This keeps your data in your own infrastructure.\n\n## Supabase Project ID\nThe unique identifier for your Supabase project (often shown in the project URL or settings).\n\n## Supabase Project URL\nThe base URL for your Supabase project, used by the app to connect to the database and APIs.\n\n## Anon Key (Public API Key)\nThe public API key for your Supabase project. It is safe for client-side use but still subject to Row Level Security (RLS).\n\n## Access Token\nA token from your Supabase account that lets the Setup Wizard create or manage projects on your behalf (used in Quick Start).\n\n## Managed Provisioning (Quick Start)\nThe Setup Wizard uses your Access Token to automatically create a Supabase project, apply migrations, deploy Edge Functions, and ingest the knowledge base.\n\n## Manual Sync (Connect Existing Project)\nYou connect an existing Supabase project by providing the Project URL and Anon Key. Migrations can be run by the wizard if an Access Token is provided.\n\n## Managed Provisioning vs Manual Sync\n**Managed Provisioning** creates a new Supabase project for you using an Access Token. \n**Manual Sync** connects to an existing Supabase project using your Project URL and Anon Key.\n\n## Migration\nDatabase changes that create or update tables, views, functions, and policies. Migrations keep your database schema aligned with the app.\n\n## Schema\nThe structure of your database: tables, columns, types, indexes, functions, and policies.\n\n## SQL\nThe language used to define and query database structures and data.\n\n## Version Mismatch\nWhen the app’s expected schema version differs from the database’s actual version. The Setup Wizard or migration tool will prompt you to normalize.\n\n## Database Version (Account Settings)\nThe database major version shown in Account Settings. It’s used to guide migrations and should match your Supabase project’s Postgres version.\n\n## Rollback\nReverting a migration. In Supabase, rollbacks are manual and should be used carefully.\n\n## RLS (Row Level Security)\nA Postgres security feature that restricts which rows a user can read or write. Supabase uses RLS to protect data.\n\n## Edge Functions\nServerless functions hosted by Supabase. Email Automator uses them for OAuth flows and secure operations.\n\n## Service Role Key\nA powerful Supabase key that bypasses RLS. It must never be exposed to clients.\n\n## Anon Key vs Service Role Key\nThe **anon key** is safe for client use and respects RLS. The **service role key** bypasses RLS and must only be used on trusted servers.\n\n## RealTimeX Desktop\nThe local app that provides AI services (LLMs, embeddings, TTS) used by Email Automator.\n\n## Digital Persona\nA profile that defines your tone, style, and preferences for AI-generated drafts and responses.\n\n## Persona Tone\nThe emotional character of replies (e.g., friendly, formal, direct).\n\n## Persona Style\nThe writing style preferences (e.g., concise, detailed, bullet points).\n\n## Persona Voice\nThe overall “sound” of your writing, including phrasing and rhythm.\n\n## Persona Signature\nA standardized sign-off used in replies (name, title, company).\n\n## Persona Role\nYour job title or role, used to shape response framing.\n\n## Persona Company\nThe organization name used in replies when appropriate.\n\n## Persona Language\nThe primary language for generated drafts.\n\n## Edge Functions\nServerless functions hosted by Supabase. Email Automator uses them for OAuth flows and secure operations.\n\n## Express API\nThe local backend that handles email syncing, AI processing, and automation execution.\n\n## Realtime (Supabase)\nLive updates from the database to the app. Used to reflect new emails, sync status, or activity without refreshing.\n\n## LLM (Large Language Model)\nAn AI model used for analysis and generating responses (e.g., categorization, drafting replies).\n\n## Embedding Model\nA model that converts text into vectors for semantic search. Used by the knowledge base and RAG.\n\n## Embeddings\nVector representations of text used for semantic search in the knowledge base.\n\n## RAG (Retrieval-Augmented Generation)\nA method that retrieves relevant documentation and feeds it to the AI so responses stay grounded in your docs.\n\n## Knowledge Base Ingestion\nThe process of converting documentation into searchable embeddings and storing them in the database.\n\n## TTS (Text-to-Speech)\nConverts AI responses into spoken audio.\n\n## TTS Provider vs Voice\nThe provider is the service that generates speech; the voice is the specific speaker/persona within that provider.\n\n## OAuth\nAn authorization standard that lets the app access your email account without storing your password.\n\n## OAuth Consent Screen\nThe screen where you grant Email Automator permission to access your email account.\n\n## Access Token (OAuth)\nA short-lived token used to call email provider APIs. It expires and is refreshed automatically.\n\n## Refresh Token\nA long-lived token used to obtain new access tokens without re‑authenticating.\n\n## Gmail API\nGoogle’s official API for accessing Gmail data and sending emails.\n\n## Microsoft Graph\nMicrosoft’s API for Outlook and Microsoft 365 data (mail, calendar, contacts).\n\n## IMAP / SMTP\nEmail protocols. IMAP reads mail; SMTP sends mail. (Email Automator uses provider APIs rather than raw IMAP/SMTP.)\n\n## App Registration (Microsoft)\nAn app configuration in Azure that provides credentials for Microsoft Graph access.\n\n## Client ID\nThe public identifier for your OAuth app (Google/Microsoft).\n\n## Client Secret\nA private secret for your OAuth app. Treat it like a password.\n\n## Redirect URI\nThe callback URL where the email provider sends users after OAuth authorization.\n\n## Device Code Flow\nAn OAuth flow where you authenticate in a browser using a short code, often used for desktop apps.\n\n## Tenant ID\nThe Microsoft tenant identifier. Use “common” for multi‑tenant or a specific tenant for org‑only access.\n\n## Sync Scope\nDefines how much history to sync (e.g., last X days) and which accounts are included.\n\n## Labels (Gmail) / Folders (Outlook)\nOrganization constructs in email providers. Labels tag messages; folders organize them into containers.\n",
|
|
10
11
|
"TROUBLESHOOTING.md": "# Troubleshooting & Support\n\nIf you encounter issues, this guide covers the most common pitfalls and their solutions.\n\n---\n\n## 📡 Synchronization Issues\n\n### Emails are not appearing in the Dashboard\n* **Check \"Sync From\" Date**: The AI only processes emails received *after* this date.\n* **Reset Checkpoint**: If you’ve changed your start date and want to re-scan old emails, click the **Reset Checkpoint** button in the Sync Scope panel.\n* **Batch Limits**: The **Max Emails** setting limits how many emails are processed per run. If you have a large backlog, it may take several sync cycles to catch up.\n* **Manual Trigger**: Click **Run Sync Now** on the Dashboard to force an immediate check.\n\n### \"Sync Failed\" or \"Backend Not Connected\"\n* **Local Server**: Ensure the Email Automator application is open and running.\n* **Live Activity Feed**: Open the **Live Activity** terminal. It often contains specific technical error messages (e.g., \"Network Error\" or \"401 Unauthorized\").\n\n---\n\n## 🔑 Authentication & Permissions\n\n### Google/Gmail: `redirect_uri_mismatch`\n* **The Fix**: Your Redirect URI in the Google Cloud Console must *exactly* match the one shown in Email Automator.\n* **Example**: `https://your-ref.supabase.co/functions/v1/auth-gmail/callback` (ensure no trailing slashes or spaces).\n\n### Microsoft/Outlook: Login fails or times out\n* **App Registration**: Ensure your Azure App Registration has \"Allow public client flows\" set to **Yes**.\n* **Account Type**: Ensure you selected \"Accounts in any organizational directory and personal Microsoft accounts\" during registration.\n\n### Supabase: \"Invalid API Key\"\n* **The Fix**: Always use the **anon (public)** key. The **service_role** key will be rejected by the app for security reasons.\n\n---\n\n## 🤖 AI & RealTimeX Integration\n\n### AI is slow or unresponsive\n* **Local Models**: If using Ollama or LM Studio, ensure your machine has sufficient RAM and your GPU is not under heavy load.\n* **Discovery**: If no models appear in the dropdown, ensure **RealTimeX Desktop** is running and you have configured at least one AI provider within it.\n\n### \"Smart Drafts\" are not being created\n* **System Toggle**: Ensure **Smart Drafts** is toggled **ON** in the Auto-Pilot tab.\n* **Rule Conflict**: Verify that the rule matching the email actually includes the **Draft** action.\n* **Safety Filter**: The AI automatically skips drafting for `no-reply` addresses and certain automated notifications to prevent \"bot loops.\"\n\n---\n\n## 🗄️ Database & Migrations\n\n### \"Database Migration Required\" Banner\n* **Why it happens**: Your local app has been updated, and your Supabase database schema needs to catch up to support new features.\n* **The Fix**: Click **Update Now** in the banner. You will need your **Supabase Access Token** to run the update automatically.\n\n### Live Terminal is empty or shows \"404\"\n* **Realtime Permissions**: Ensure you have run the latest migrations. The `processing_events` table must exist and have the correct RLS (Row Level Security) policies enabled.\n\n---\n\n## 🆘 Still Need Help?\n\nIf your issue isn't listed here:\n1. Check the **System Logs** in the Account Settings for technical stack traces.\n2. Review the [Developer Documentation](../docs-dev/README.md) for advanced setup details.\n3. Open a ticket or discussion in the project repository.\n"
|
|
11
12
|
};
|
package/api/src/routes/agent.ts
CHANGED
|
@@ -104,6 +104,7 @@ router.post('/chat', async (req: Request, res: Response) => {
|
|
|
104
104
|
# Current Context
|
|
105
105
|
- **Current Page**: ${context?.page_id || 'global'}
|
|
106
106
|
- **Page Data**: ${JSON.stringify(context?.data || {}, null, 2)}
|
|
107
|
+
- **User Language**: ${context?.lang || 'en'} — respond in this language
|
|
107
108
|
|
|
108
109
|
# Response Instructions
|
|
109
110
|
**When Answering:**
|
|
@@ -8,6 +8,7 @@ export interface AgentContextPayload {
|
|
|
8
8
|
system_instruction?: string;
|
|
9
9
|
data?: any;
|
|
10
10
|
tools?: any[];
|
|
11
|
+
lang?: string;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
export interface AgentMessage {
|
|
@@ -58,6 +59,7 @@ export class AgentService {
|
|
|
58
59
|
# Current Context
|
|
59
60
|
- **Current Page**: ${context.page_id}
|
|
60
61
|
- **Page Data**: ${JSON.stringify(context.data || {}, null, 2)}
|
|
62
|
+
- **User Language**: ${context.lang || 'en'} — respond in this language
|
|
61
63
|
`;
|
|
62
64
|
|
|
63
65
|
if (hasRAGContent) {
|
|
@@ -77,13 +79,10 @@ ${ragContext.contextText}
|
|
|
77
79
|
|
|
78
80
|
2. **Never fabricate features** - Do not invent capabilities, settings, buttons, or workflows not documented
|
|
79
81
|
|
|
80
|
-
3. **
|
|
81
|
-
|
|
82
|
-
4. **Exact references only** - Only mention page names, buttons, settings, and steps that appear in the Retrieved Documentation
|
|
82
|
+
3. **Exact references only** - Only mention page names, buttons, settings, and steps that appear in the Retrieved Documentation
|
|
83
83
|
|
|
84
84
|
**When Answering:**
|
|
85
85
|
- Base your answer ONLY on the Retrieved Documentation above
|
|
86
|
-
- Reference the source file and section when relevant
|
|
87
86
|
- Provide step-by-step instructions when they exist in the docs
|
|
88
87
|
- If user asks about a different page, guide them: "Go to [Page Name] → [Section]"`;
|
|
89
88
|
} else {
|
|
@@ -74,6 +74,7 @@ export class RAGService {
|
|
|
74
74
|
topK?: number;
|
|
75
75
|
similarityThreshold?: number;
|
|
76
76
|
sourceFilter?: string[];
|
|
77
|
+
lang?: string;
|
|
77
78
|
settings?: { embedding_provider?: string; embedding_model?: string };
|
|
78
79
|
} = {}
|
|
79
80
|
): Promise<RAGContext> {
|
|
@@ -81,6 +82,7 @@ export class RAGService {
|
|
|
81
82
|
topK = 5,
|
|
82
83
|
similarityThreshold = 0.7,
|
|
83
84
|
sourceFilter,
|
|
85
|
+
lang = 'en',
|
|
84
86
|
settings
|
|
85
87
|
} = options;
|
|
86
88
|
|
|
@@ -89,15 +91,36 @@ export class RAGService {
|
|
|
89
91
|
const queryEmbedding = await this.embedQuery(query, settings);
|
|
90
92
|
|
|
91
93
|
// 2. Search knowledge base
|
|
92
|
-
console.log(`[RAGService] Searching knowledge base (topK=${topK}, threshold=${similarityThreshold})...`);
|
|
94
|
+
console.log(`[RAGService] Searching knowledge base (topK=${topK}, threshold=${similarityThreshold}, lang=${lang})...`);
|
|
93
95
|
console.log(`[RAGService] Query embedding dimensions: ${queryEmbedding.length}`);
|
|
94
96
|
|
|
95
|
-
|
|
97
|
+
// Try searching with language filter
|
|
98
|
+
let { data, error } = await this.supabase.rpc('search_knowledge', {
|
|
96
99
|
query_embedding: queryEmbedding,
|
|
97
100
|
match_threshold: similarityThreshold,
|
|
98
|
-
match_count: topK
|
|
101
|
+
match_count: topK,
|
|
102
|
+
model_filter: null,
|
|
103
|
+
lang_filter: lang
|
|
99
104
|
});
|
|
100
105
|
|
|
106
|
+
// Fallback: If no results found with language filter (or if lang is invalid), try without filter (only if lang wasn't 'en')
|
|
107
|
+
// This handles cases where a specific language might not have content yet, falling back to English (default)
|
|
108
|
+
if (!error && (!data || data.length === 0) && lang !== 'en') {
|
|
109
|
+
console.log(`[RAGService] No results for lang='${lang}', falling back to 'en'...`);
|
|
110
|
+
const fallbackResult = await this.supabase.rpc('search_knowledge', {
|
|
111
|
+
query_embedding: queryEmbedding,
|
|
112
|
+
match_threshold: similarityThreshold,
|
|
113
|
+
match_count: topK,
|
|
114
|
+
model_filter: null,
|
|
115
|
+
lang_filter: 'en'
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (!fallbackResult.error) {
|
|
119
|
+
data = fallbackResult.data;
|
|
120
|
+
error = null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
101
124
|
if (error) {
|
|
102
125
|
console.error('[RAGService] Search failed:', error);
|
|
103
126
|
console.error('[RAGService] Error details:', JSON.stringify(error, null, 2));
|
|
@@ -5,6 +5,7 @@ export const SETUP_KNOWLEDGE = {
|
|
|
5
5
|
"AUTOMATION.md": "# Automation & Auto-Pilot\n\nThe **Auto-Pilot** tab is the central hub for managing your AI agent's behavior. It consolidates \"System Rules\" (global toggles) and a library of **26 built-in intelligent rules** alongside your own \"Custom Rules.\"\n\n---\n\n## 🛡️ Built-in System Rules\n\nEmail Automator comes with 26 pre-configured rules designed by AI experts to handle common inbox challenges. These are organized into functional categories to help you stay organized.\n\n### 📧 Email Organization\n* **Newsletter Sweeper**: Auto-archives newsletters and marketing emails to keep your inbox clean.\n* **Receipt Organizer**: Automatically files receipts and order confirmations.\n* **CC Organizer**: Labels emails where you are CC'd for quick triage.\n* **Cold Outreach Filter**: Moves cold sales emails to a separate folder.\n* **Social Noise**: Minimizes LinkedIn and social network notifications.\n* **Stack Overflow Digests**: Auto-archives technical digests unless they require immediate attention.\n\n### 🚨 Priority & Alerts\n* **VIP Urgent Messages**: Stars urgent messages from key stakeholders (CEOs, Board members).\n* **Critical Alerts**: Surfaces production incidents and P0/P1 critical alerts.\n* **Urgent Support Tickets**: Highlights high-priority customer issues needing immediate action.\n\n### 💻 Development\n* **GitHub Mentions**: Tracks when you are specifically mentioned in Pull Requests or Issues.\n* **CI/CD Failures**: Highlights build and deployment failures from tools like CircleCI or GitHub Actions.\n* **Code Review Requests**: Organizes incoming requests for code reviews.\n* **Dependabot Noise**: Auto-archives low-priority dependency updates while keeping security alerts visible.\n* **Monitoring Alerts**: Organizes non-urgent monitoring and logging alerts.\n\n### 💼 Sales & Business\n* **Hot Leads**: Prioritizes high-intent prospect replies based on positive sentiment.\n* **Follow-up Reminders**: Tracks prospect responses that specifically request a follow-up.\n* **Referrals & Intros**: Ensures you never miss a warm introduction or referral.\n* **Contracts & Proposals**: Highlights important contract communications and legal documents.\n* **Objections & Concerns**: Flags emails expressing concerns or hesitation for careful handling.\n* **Nurture Campaigns**: Archives automated drip campaign emails to prioritize personal replies.\n* **Financial Updates**: Keeps revenue reports and quarterly budget updates easily accessible.\n\n### ⚙️ Operations\n* **Internal Requests**: Organizes cross-team requests and action items.\n* **Vendor Communications**: Tracks invoices, shipments, and vendor-related updates.\n* **System Alerts**: Organizes infrastructure and system notifications.\n* **Meeting Invites**: Separates calendar invites for easier scheduling management.\n* **Weekly Reports**: Auto-files regular status reports and progress updates.\n\n---\n\n## 🛠️ Building Custom Rules\n\nCustom rules allow you to create precise, AI-driven workflows. You can create, edit, and manage these directly within the **Auto-Pilot** tab.\n\n### 1. Conditions (The \"If\")\nYou can mix and match metadata and AI-powered conditions:\n* **AI Insights**: Category (e.g., Newsletter, Receipt, Personal), Sentiment (Positive, Negative, Neutral), or Priority (High, Medium, Low).\n* **Metadata**: Sender domain (e.g., `github.com`), specific keywords in the subject, or sender's name.\n* **Retention Filter**: \"Only act if the email is older than X days.\" This is perfect for cleaning up old newsletters or notifications.\n\n### 2. Actions (The \"Then\")\nChoose what happens when an email matches your conditions:\n* **Archive / Delete**: Keep your inbox clean automatically.\n* **Star / Flag**: Highlight important items for manual review.\n* **Draft**: The most powerful action. It tells the AI to prepare a reply.\n\n---\n\n## ✍️ Smart Context & Ghostwriting\n\nWhen you use the **Draft** action, you can provide the AI with specific instructions to ensure the reply matches your needs:\n\n* **Ghostwriting Instructions**: Tell the AI *how* to reply (e.g., \"Be polite but firm in declining the invitation,\" or \"Ask for their availability next Tuesday\").\n* **Rule Attachments**: You can upload standard documents (like a pricing sheet or a bio) that the AI will automatically include as attachments whenever this rule triggers a draft.\n\n---\n\n## 🚀 The Auto-Pilot Tab\n\nThe **Auto-Pilot** tab provides a bird's-eye view of your automation engine.\n* **Grouped View**: Rules are organized by their primary intent.\n* **Quick Toggles**: Enable or disable rules instantly without deleting them.\n* **Status Indicators**: See which rules are currently active and how many emails they've processed.\n\n---\n\n## 💡 Best Practices\n\n* **Start Passive**: Set your first rules to **Star** or **Archive** instead of **Delete** until you are confident in the AI's categorization.\n* **Use Retention for Noise**: Use a rule like: `If Category = Newsletter AND Age > 30 Days THEN Delete`. This keeps your \"read\" newsletters from cluttering your archive forever.\n* **Refine with Feedback**: If a rule isn't matching correctly, use the **Feedback** icon on the Dashboard to improve the AI's understanding of that specific email type.\n\n---\n\n**Next Step:** [Account & Security Management](./ACCOUNT.md)\n",
|
|
6
6
|
"CONFIGURATION.md": "# Configuration\n\nThe **Configuration** tab is the command center of Email Automator. Here, you connect your email providers, define your AI's behavior, and set up the rules that drive automation.\n\n---\n\n## 📧 Email Accounts (BYOK)\n\nEmail Automator follows a **\"Bring Your Own Key\" (BYOK)** model. You provide your own OAuth credentials, ensuring that your data access remains entirely under your control.\n\n### 🔴 Gmail Setup (OAuth 2.0)\n1. **Google Cloud Console**: Create a project and enable the **Gmail API**.\n2. **Consent Screen**: Configure the OAuth consent screen and add your email as a **Test User**.\n3. **Credentials**: Create an **OAuth 2.0 Client ID** (Type: Web Application).\n * **Authorized Redirect URI**: `https://<your-project-ref>.supabase.co/functions/v1/auth-gmail/callback`\n4. **Connect**: In Email Automator, click **Connect Gmail**.\n5. **Authorize**: Paste your Client ID and Secret (or upload the JSON), then follow the link to authorize your account.\n\n### 🔵 Outlook Setup (Device Code)\n1. **Azure Portal**: Register a new application in **App Registrations**.\n2. **Account Type**: Select \"Accounts in any organizational directory and personal Microsoft accounts\".\n3. **Authentication**: Ensure \"Allow public client flows\" is set to **Yes**.\n4. **Connect**: In Email Automator, click **Connect Outlook** and enter your **Client ID**.\n5. **Authorize**: Follow the **Device Code** prompt in your browser to complete the sign-in.\n\n---\n\n## 📅 Sync Scope & Limits\n\nBefore starting your first sync, configure the boundaries to ensure performance and cost-efficiency:\n\n* **Sync From**: Choose the starting date (e.g., \"From Now\" or a specific historical date).\n* **Max Emails**: Set the maximum number of emails to process in a single batch (Default: 50).\n* **Sync Interval**: Define how often the background scheduler should check for new mail (e.g., every 15 minutes).\n\n> [!TIP]\n> **Start Small**: For your first run, we recommend setting \"Sync From\" to \"Now\" and \"Max Emails\" to 10-20 to verify your rules are working as expected.\n\n---\n\n## 🤖 Automation & Auto-Pilot\n\nManagement of your AI's behavior—including building custom rules, toggling system automations, and setting retention policies—has been consolidated into the **[Auto-Pilot](./AUTOMATION.md)** tab.\n\n---\n\n## 🧠 AI & System Settings\n\n### Provider Configuration\nEmail Automator detects available models via **RealTimeX Desktop**.\n* **LLM Provider**: Choose your preferred AI engine (e.g., OpenAI, Anthropic, or local models).\n* **Embedding Model**: Used for the RAG (Retrieval-Augmented Generation) system to help the AI understand your specific context.\n\n### Voice & Accessibility (TTS)\nEnable **Text-to-Speech** to have the AI read summaries or important alerts aloud.\n* **Auto-Speak**: Automatically read high-priority notifications.\n* **Voice Profile**: Choose from various high-quality voices available through RealTimeX.\n\n---\n\n**Next Step:** [Monitoring the Dashboard](./DASHBOARD.md)\n",
|
|
7
7
|
"DASHBOARD.md": "# Dashboard & Live Activity\n\nThe **Dashboard** is your primary interface for monitoring your AI agent’s activity and managing your analyzed inbox. It is designed to provide complete transparency into how the AI thinks and acts.\n\n---\n\n## 📊 The Analysis Feed\n\nAs the AI processes your inbox, emails appear in the feed with real-time status updates and intelligent insights.\n\n* **Smart Search**: Quickly find emails by keyword or sender.\n* **AI Filters**: Filter your view by Category (e.g., Newsletter, Personal), Sentiment, or Priority.\n* **Dynamic Sorting**: Toggle between the time an email was *received* and the time it was *processed* by the AI.\n\n### 📌 Email Detail Sidebar\nClicking any email card opens a detailed side panel containing:\n* **AI Summary**: A concise overview of the email's content.\n* **Key Points**: Bulleted highlights extracted by the AI.\n* **Draft Preview**: If a draft reply was generated, you can review it here before it's sent.\n* **Quick Links**: Jump directly to the original email in your Gmail or Outlook web interface.\n\n---\n\n## 🛡️ Trust & Transparency\n\nEmail Automator is built on the principle of **\"Glass Box AI.\"** You should always know *why* an action was taken.\n\n### 📟 Live Activity Terminal\nClick the **Live Activity** button in the bottom-right corner to open the real-time processing feed.\n* **Thinking Logs**: Watch the AI analyze content, evaluate rules, and decide on actions.\n* **Technical Details**: See raw API calls, processing durations, and background sync statuses.\n* **Control**: You can manually stop an active sync directly from the terminal.\n\n### 🕵️ AI Trace\nClick the **Eye icon** on any email card to open the **AI Trace Modal**.\n* **Decision Logic**: View a step-by-step breakdown of why the AI assigned a specific category or priority.\n* **Raw Data**: See the exact prompt sent to the LLM and the raw JSON response it returned.\n* **Performance Stats**: Review token usage and processing time for that specific email.\n\n---\n\n## ⚡ Quick Actions\n\nTake control with one-click actions available on every email card:\n* 🗑️ **Delete / 📦 Archive**: Instant cleanup.\n* ⭐ **Star / Flag**: Mark important items for later.\n* 🔄 **Reprocess**: If you’ve updated your rules, you can ask the AI to analyze an email again.\n* 💬 **Feedback**: Help the AI learn by reporting incorrect categorizations or sentiment analysis.\n\n---\n\n## 🔔 Notifications & Feedback\n\nThe app uses multi-sensory feedback to keep you informed of background activity:\n* **Visual**: Live status badges and toast notifications.\n* **Audio**: Subtle, high-quality chimes for new emails, high-priority alerts, and sync completion.\n* **Haptic**: Physical feedback on supported devices.\n\n> **Note**: Sound and Haptic settings can be customized in [**Account Settings**](./ACCOUNT.md).\n\n---\n\n## 📈 Analytics & History\n\nStay informed about your agent's performance:\n* **Sync History**: View a log of recent sync runs, including the number of emails processed and any actions taken.\n* **Efficiency Stats**: See totals for automated deletions, archives, and drafts over time.\n\n---\n\n**Next Step:** [Creating Automation Rules](./AUTOMATION.md)\n",
|
|
8
|
-
"GETTING-STARTED.md": "# Getting Started\n\nWelcome to **Email Automator**, your AI-powered personal email assistant. This guide will help you set up the application using the **\"Bring Your Own Key\" (BYOK)** model, which ensures your data remains under your control within your own Supabase infrastructure.\n\n## 🛠 Prerequisites\n\nBefore you begin, ensure you have the following:\n\n1. **RealTimeX Desktop**: Installed and running. This is required for AI processing (LLMs) and Text-to-Speech (TTS) capabilities.\n2. **Supabase Account**: A free or paid account at [supabase.com](https://supabase.com).\n\n---\n\n## 🚀 Quick Setup with the Wizard\n\nThe built-in **Setup Wizard** is the recommended way to get started. It automates the technical heavy lifting.\n\n### 1. Purchase & Launch\n* Open **RealTimeX Desktop**.\n* Go to the **Marketplace** tab → **Local Apps**.\n* Search for **\"Email Automator\"** and purchase it (or activate if already owned).\n* Once purchased, click **Launch** from your Local Apps list.\n\n### 2. Run the Setup Wizard\nUpon first launch, the app will guide you through the initial configuration:\n\n* **Choose a Setup Path**:\n * **Managed Provisioning (Recommended)**: Provide a **Supabase Access Token**. The wizard will automatically create a new project, run database migrations, deploy Edge Functions, and ingest the initial knowledge base.\n * **Connect Existing Project**: Use an existing Supabase project by providing your **Project URL** and **Anon Key**. You can optionally provide an Access Token here to have the wizard run migrations for you.\n\n### 3. Create Your Account\nOnce the database is ready, you will be prompted to create your local user account and sign in to access the **Dashboard**.\n\n---\n\n## 🔍 Finding Your Supabase Credentials\n\nIf you choose to connect an existing project manually, you can find your credentials in the [Supabase Dashboard](https://supabase.com/dashboard):\n\n1. Select your project.\n2. Navigate to **Settings** → **API**.\n3. **Project URL**: Copy the URL found under \"Project URL\".\n4. **API Key**: Copy the **anon (public)** key under \"Project API keys\".\n\n> [!WARNING]\n> **Security Note**: Never use the `service_role` key. It has full administrative bypass privileges and should never be exposed in client-side applications.\n\n---\n\n## 🪪 Generating an Access Token\n\nAn Access Token allows the Setup Wizard to manage your Supabase projects (creation, migrations, function deployment) on your behalf.\n\n1. In your Supabase Dashboard, go to **Account** → **Access Tokens**.\n2. Click **Generate new token**, give it a name (e.g., \"Email Automator\"), and copy the result.\n3. Paste this token into the Setup Wizard when prompted.\n\n---\n\n**Next Step:** [Configure your Email Accounts](./CONFIGURATION.md)\n",
|
|
8
|
+
"GETTING-STARTED.md": "# Getting Started\n\nWelcome to **Email Automator**, your AI-powered personal email assistant. This guide will help you set up the application using the **\"Bring Your Own Key\" (BYOK)** model, which ensures your data remains under your control within your own Supabase infrastructure.\n\n## 🛠 Prerequisites\n\nBefore you begin, ensure you have the following:\n\n1. **RealTimeX Desktop**: Installed and running. This is required for AI processing (LLMs) and Text-to-Speech (TTS) capabilities.\n2. **Supabase Account**: A free or paid account at [supabase.com](https://supabase.com).\n\n---\n\n## 🚀 Quick Setup with the Wizard\n\nThe built-in **Setup Wizard** is the recommended way to get started. It automates the technical heavy lifting.\n\n### 1. Purchase & Launch\n* Open **RealTimeX Desktop**.\n* Go to the **Marketplace** tab → **Local Apps**.\n* Search for **\"Email Automator\"** and purchase it (or activate if already owned).\n* Once purchased, click **Launch** from your Local Apps list.\n\n### 2. Run the Setup Wizard\nUpon first launch, the app will guide you through the initial configuration:\n\n* **Choose a Setup Path**:\n * **Managed Provisioning (Recommended)**: Provide a **Supabase Access Token**. The wizard will automatically create a new project, run database migrations, deploy Edge Functions, and ingest the initial knowledge base.\n * **Connect Existing Project**: Use an existing Supabase project by providing your **Project URL** and **Anon Key**. You can optionally provide an Access Token here to have the wizard run migrations for you.\n\n### 3. Create Your Account\nOnce the database is ready, you will be prompted to create your local user account and sign in to access the **Dashboard**.\n\n---\n\n## 🔍 Finding Your Supabase Credentials\n\nIf you choose to connect an existing project manually, you can find your credentials in the [Supabase Dashboard](https://supabase.com/dashboard):\n\n1. Select your project.\n2. Navigate to **Settings** → **API**.\n3. **Project URL**: Copy the URL found under \"Project URL\".\n4. **API Key**: Copy the **anon (public)** key under \"Project API keys\".\n\n> [!WARNING]\n> **Security Note**: Never use the `service_role` key. It has full administrative bypass privileges and should never be exposed in client-side applications.\n\n---\n\n## 🪪 Generating an Access Token\n\nAn Access Token allows the Setup Wizard to manage your Supabase projects (creation, migrations, function deployment) on your behalf.\n\n1. In your Supabase Dashboard, go to **Account** → **Access Tokens**.\n2. Click **Generate new token**, give it a name (e.g., \"Email Automator\"), and copy the result.\n3. Paste this token into the Setup Wizard when prompted.\n\n---\n\n**Next Step:** [Configure your Email Accounts](./CONFIGURATION.md) \n**Glossary:** [Common Terms](./GLOSSARY.md)\n",
|
|
9
|
+
"GLOSSARY.md": "# Glossary\n\nDefinitions of common terms used in Email Automator and the Setup Wizard.\n\n## Supabase\nA backend platform that provides a hosted Postgres database, authentication, storage, and APIs. Email Automator uses Supabase as its database and auth layer.\n\n## BYOK (Bring Your Own Key)\nA setup model where you connect your own Supabase project instead of using a shared backend. This keeps your data in your own infrastructure.\n\n## Supabase Project ID\nThe unique identifier for your Supabase project (often shown in the project URL or settings).\n\n## Supabase Project URL\nThe base URL for your Supabase project, used by the app to connect to the database and APIs.\n\n## Anon Key (Public API Key)\nThe public API key for your Supabase project. It is safe for client-side use but still subject to Row Level Security (RLS).\n\n## Access Token\nA token from your Supabase account that lets the Setup Wizard create or manage projects on your behalf (used in Quick Start).\n\n## Managed Provisioning (Quick Start)\nThe Setup Wizard uses your Access Token to automatically create a Supabase project, apply migrations, deploy Edge Functions, and ingest the knowledge base.\n\n## Manual Sync (Connect Existing Project)\nYou connect an existing Supabase project by providing the Project URL and Anon Key. Migrations can be run by the wizard if an Access Token is provided.\n\n## Managed Provisioning vs Manual Sync\n**Managed Provisioning** creates a new Supabase project for you using an Access Token. \n**Manual Sync** connects to an existing Supabase project using your Project URL and Anon Key.\n\n## Migration\nDatabase changes that create or update tables, views, functions, and policies. Migrations keep your database schema aligned with the app.\n\n## Schema\nThe structure of your database: tables, columns, types, indexes, functions, and policies.\n\n## SQL\nThe language used to define and query database structures and data.\n\n## Version Mismatch\nWhen the app’s expected schema version differs from the database’s actual version. The Setup Wizard or migration tool will prompt you to normalize.\n\n## Database Version (Account Settings)\nThe database major version shown in Account Settings. It’s used to guide migrations and should match your Supabase project’s Postgres version.\n\n## Rollback\nReverting a migration. In Supabase, rollbacks are manual and should be used carefully.\n\n## RLS (Row Level Security)\nA Postgres security feature that restricts which rows a user can read or write. Supabase uses RLS to protect data.\n\n## Edge Functions\nServerless functions hosted by Supabase. Email Automator uses them for OAuth flows and secure operations.\n\n## Service Role Key\nA powerful Supabase key that bypasses RLS. It must never be exposed to clients.\n\n## Anon Key vs Service Role Key\nThe **anon key** is safe for client use and respects RLS. The **service role key** bypasses RLS and must only be used on trusted servers.\n\n## RealTimeX Desktop\nThe local app that provides AI services (LLMs, embeddings, TTS) used by Email Automator.\n\n## Digital Persona\nA profile that defines your tone, style, and preferences for AI-generated drafts and responses.\n\n## Persona Tone\nThe emotional character of replies (e.g., friendly, formal, direct).\n\n## Persona Style\nThe writing style preferences (e.g., concise, detailed, bullet points).\n\n## Persona Voice\nThe overall “sound” of your writing, including phrasing and rhythm.\n\n## Persona Signature\nA standardized sign-off used in replies (name, title, company).\n\n## Persona Role\nYour job title or role, used to shape response framing.\n\n## Persona Company\nThe organization name used in replies when appropriate.\n\n## Persona Language\nThe primary language for generated drafts.\n\n## Edge Functions\nServerless functions hosted by Supabase. Email Automator uses them for OAuth flows and secure operations.\n\n## Express API\nThe local backend that handles email syncing, AI processing, and automation execution.\n\n## Realtime (Supabase)\nLive updates from the database to the app. Used to reflect new emails, sync status, or activity without refreshing.\n\n## LLM (Large Language Model)\nAn AI model used for analysis and generating responses (e.g., categorization, drafting replies).\n\n## Embedding Model\nA model that converts text into vectors for semantic search. Used by the knowledge base and RAG.\n\n## Embeddings\nVector representations of text used for semantic search in the knowledge base.\n\n## RAG (Retrieval-Augmented Generation)\nA method that retrieves relevant documentation and feeds it to the AI so responses stay grounded in your docs.\n\n## Knowledge Base Ingestion\nThe process of converting documentation into searchable embeddings and storing them in the database.\n\n## TTS (Text-to-Speech)\nConverts AI responses into spoken audio.\n\n## TTS Provider vs Voice\nThe provider is the service that generates speech; the voice is the specific speaker/persona within that provider.\n\n## OAuth\nAn authorization standard that lets the app access your email account without storing your password.\n\n## OAuth Consent Screen\nThe screen where you grant Email Automator permission to access your email account.\n\n## Access Token (OAuth)\nA short-lived token used to call email provider APIs. It expires and is refreshed automatically.\n\n## Refresh Token\nA long-lived token used to obtain new access tokens without re‑authenticating.\n\n## Gmail API\nGoogle’s official API for accessing Gmail data and sending emails.\n\n## Microsoft Graph\nMicrosoft’s API for Outlook and Microsoft 365 data (mail, calendar, contacts).\n\n## IMAP / SMTP\nEmail protocols. IMAP reads mail; SMTP sends mail. (Email Automator uses provider APIs rather than raw IMAP/SMTP.)\n\n## App Registration (Microsoft)\nAn app configuration in Azure that provides credentials for Microsoft Graph access.\n\n## Client ID\nThe public identifier for your OAuth app (Google/Microsoft).\n\n## Client Secret\nA private secret for your OAuth app. Treat it like a password.\n\n## Redirect URI\nThe callback URL where the email provider sends users after OAuth authorization.\n\n## Device Code Flow\nAn OAuth flow where you authenticate in a browser using a short code, often used for desktop apps.\n\n## Tenant ID\nThe Microsoft tenant identifier. Use “common” for multi‑tenant or a specific tenant for org‑only access.\n\n## Sync Scope\nDefines how much history to sync (e.g., last X days) and which accounts are included.\n\n## Labels (Gmail) / Folders (Outlook)\nOrganization constructs in email providers. Labels tag messages; folders organize them into containers.\n",
|
|
9
10
|
"TROUBLESHOOTING.md": "# Troubleshooting & Support\n\nIf you encounter issues, this guide covers the most common pitfalls and their solutions.\n\n---\n\n## 📡 Synchronization Issues\n\n### Emails are not appearing in the Dashboard\n* **Check \"Sync From\" Date**: The AI only processes emails received *after* this date.\n* **Reset Checkpoint**: If you’ve changed your start date and want to re-scan old emails, click the **Reset Checkpoint** button in the Sync Scope panel.\n* **Batch Limits**: The **Max Emails** setting limits how many emails are processed per run. If you have a large backlog, it may take several sync cycles to catch up.\n* **Manual Trigger**: Click **Run Sync Now** on the Dashboard to force an immediate check.\n\n### \"Sync Failed\" or \"Backend Not Connected\"\n* **Local Server**: Ensure the Email Automator application is open and running.\n* **Live Activity Feed**: Open the **Live Activity** terminal. It often contains specific technical error messages (e.g., \"Network Error\" or \"401 Unauthorized\").\n\n---\n\n## 🔑 Authentication & Permissions\n\n### Google/Gmail: `redirect_uri_mismatch`\n* **The Fix**: Your Redirect URI in the Google Cloud Console must *exactly* match the one shown in Email Automator.\n* **Example**: `https://your-ref.supabase.co/functions/v1/auth-gmail/callback` (ensure no trailing slashes or spaces).\n\n### Microsoft/Outlook: Login fails or times out\n* **App Registration**: Ensure your Azure App Registration has \"Allow public client flows\" set to **Yes**.\n* **Account Type**: Ensure you selected \"Accounts in any organizational directory and personal Microsoft accounts\" during registration.\n\n### Supabase: \"Invalid API Key\"\n* **The Fix**: Always use the **anon (public)** key. The **service_role** key will be rejected by the app for security reasons.\n\n---\n\n## 🤖 AI & RealTimeX Integration\n\n### AI is slow or unresponsive\n* **Local Models**: If using Ollama or LM Studio, ensure your machine has sufficient RAM and your GPU is not under heavy load.\n* **Discovery**: If no models appear in the dropdown, ensure **RealTimeX Desktop** is running and you have configured at least one AI provider within it.\n\n### \"Smart Drafts\" are not being created\n* **System Toggle**: Ensure **Smart Drafts** is toggled **ON** in the Auto-Pilot tab.\n* **Rule Conflict**: Verify that the rule matching the email actually includes the **Draft** action.\n* **Safety Filter**: The AI automatically skips drafting for `no-reply` addresses and certain automated notifications to prevent \"bot loops.\"\n\n---\n\n## 🗄️ Database & Migrations\n\n### \"Database Migration Required\" Banner\n* **Why it happens**: Your local app has been updated, and your Supabase database schema needs to catch up to support new features.\n* **The Fix**: Click **Update Now** in the banner. You will need your **Supabase Access Token** to run the update automatically.\n\n### Live Terminal is empty or shows \"404\"\n* **Realtime Permissions**: Ensure you have run the latest migrations. The `processing_events` table must exist and have the correct RLS (Row Level Security) policies enabled.\n\n---\n\n## 🆘 Still Need Help?\n\nIf your issue isn't listed here:\n1. Check the **System Logs** in the Account Settings for technical stack traces.\n2. Review the [Developer Documentation](../docs-dev/README.md) for advanced setup details.\n3. Open a ticket or discussion in the project repository.\n"
|
|
10
11
|
};
|
|
@@ -85,6 +85,7 @@ router.post('/chat', async (req, res) => {
|
|
|
85
85
|
# Current Context
|
|
86
86
|
- **Current Page**: ${context?.page_id || 'global'}
|
|
87
87
|
- **Page Data**: ${JSON.stringify(context?.data || {}, null, 2)}
|
|
88
|
+
- **User Language**: ${context?.lang || 'en'} — respond in this language
|
|
88
89
|
|
|
89
90
|
# Response Instructions
|
|
90
91
|
**When Answering:**
|
|
@@ -33,6 +33,7 @@ export class AgentService {
|
|
|
33
33
|
# Current Context
|
|
34
34
|
- **Current Page**: ${context.page_id}
|
|
35
35
|
- **Page Data**: ${JSON.stringify(context.data || {}, null, 2)}
|
|
36
|
+
- **User Language**: ${context.lang || 'en'} — respond in this language
|
|
36
37
|
`;
|
|
37
38
|
if (hasRAGContent) {
|
|
38
39
|
// Strict mode: Only use retrieved documentation
|
|
@@ -51,13 +52,10 @@ ${ragContext.contextText}
|
|
|
51
52
|
|
|
52
53
|
2. **Never fabricate features** - Do not invent capabilities, settings, buttons, or workflows not documented
|
|
53
54
|
|
|
54
|
-
3. **
|
|
55
|
-
|
|
56
|
-
4. **Exact references only** - Only mention page names, buttons, settings, and steps that appear in the Retrieved Documentation
|
|
55
|
+
3. **Exact references only** - Only mention page names, buttons, settings, and steps that appear in the Retrieved Documentation
|
|
57
56
|
|
|
58
57
|
**When Answering:**
|
|
59
58
|
- Base your answer ONLY on the Retrieved Documentation above
|
|
60
|
-
- Reference the source file and section when relevant
|
|
61
59
|
- Provide step-by-step instructions when they exist in the docs
|
|
62
60
|
- If user asks about a different page, guide them: "Go to [Page Name] → [Section]"`;
|
|
63
61
|
}
|
|
@@ -38,18 +38,37 @@ export class RAGService {
|
|
|
38
38
|
* Retrieve relevant knowledge chunks for a query
|
|
39
39
|
*/
|
|
40
40
|
async retrieve(query, options = {}) {
|
|
41
|
-
const { topK = 5, similarityThreshold = 0.7, sourceFilter, settings } = options;
|
|
41
|
+
const { topK = 5, similarityThreshold = 0.7, sourceFilter, lang = 'en', settings } = options;
|
|
42
42
|
// 1. Generate query embedding
|
|
43
43
|
console.log('[RAGService] Generating query embedding...');
|
|
44
44
|
const queryEmbedding = await this.embedQuery(query, settings);
|
|
45
45
|
// 2. Search knowledge base
|
|
46
|
-
console.log(`[RAGService] Searching knowledge base (topK=${topK}, threshold=${similarityThreshold})...`);
|
|
46
|
+
console.log(`[RAGService] Searching knowledge base (topK=${topK}, threshold=${similarityThreshold}, lang=${lang})...`);
|
|
47
47
|
console.log(`[RAGService] Query embedding dimensions: ${queryEmbedding.length}`);
|
|
48
|
-
|
|
48
|
+
// Try searching with language filter
|
|
49
|
+
let { data, error } = await this.supabase.rpc('search_knowledge', {
|
|
49
50
|
query_embedding: queryEmbedding,
|
|
50
51
|
match_threshold: similarityThreshold,
|
|
51
|
-
match_count: topK
|
|
52
|
+
match_count: topK,
|
|
53
|
+
model_filter: null,
|
|
54
|
+
lang_filter: lang
|
|
52
55
|
});
|
|
56
|
+
// Fallback: If no results found with language filter (or if lang is invalid), try without filter (only if lang wasn't 'en')
|
|
57
|
+
// This handles cases where a specific language might not have content yet, falling back to English (default)
|
|
58
|
+
if (!error && (!data || data.length === 0) && lang !== 'en') {
|
|
59
|
+
console.log(`[RAGService] No results for lang='${lang}', falling back to 'en'...`);
|
|
60
|
+
const fallbackResult = await this.supabase.rpc('search_knowledge', {
|
|
61
|
+
query_embedding: queryEmbedding,
|
|
62
|
+
match_threshold: similarityThreshold,
|
|
63
|
+
match_count: topK,
|
|
64
|
+
model_filter: null,
|
|
65
|
+
lang_filter: 'en'
|
|
66
|
+
});
|
|
67
|
+
if (!fallbackResult.error) {
|
|
68
|
+
data = fallbackResult.data;
|
|
69
|
+
error = null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
53
72
|
if (error) {
|
|
54
73
|
console.error('[RAGService] Search failed:', error);
|
|
55
74
|
console.error('[RAGService] Error details:', JSON.stringify(error, null, 2));
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const e={"app.name":"Email Automator","app.connecting":"Conectando cuenta...","app.loadingWorkspace":"Cargando tu espacio de trabajo...","app.loggedOut":"Sesión cerrada exitosamente","app.statusLive":"EN VIVO","app.statusOffline":"DESCONECTADO","common.loading":"Cargando...","common.save":"Guardar cambios","common.cancel":"Cancelar","common.delete":"Eliminar","common.success":"Éxito","common.error":"Error","common.warning":"Advertencia","common.syncNow":"Sincronizar ahora","common.syncing":"Sincronizando...","common.stopSync":"Detener sincronización","common.systemSync":"Sincronización del sistema","common.viewLogs":"Ver registros","common.saveChanges":"Guardar cambios","common.errorOccurred":"Ocurrió un error","common.previous":"Anterior","common.next":"Siguiente","common.of":"de","common.yes":"Sí","common.no":"No","common.archive":"Archivar","common.flag":"Marcar","common.on":"Activado","common.off":"Desactivado","common.enabled":"Habilitado","common.disabled":"Deshabilitado","common.active":"Activo","common.inactive":"Inactivo","common.draft":"Borrador","common.star":"Estrella","nav.dashboard":"Panel de control","nav.drafts":"Borradores","nav.autopilot":"Piloto automático","nav.analytics":"Analítica","nav.configuration":"Configuración","nav.accountSettings":"Configuración de cuenta","nav.signOut":"Cerrar sesión","drafts.title":"Centro de revisión de borradores","drafts.pending":"borradores pendientes","drafts.noDrafts":"No hay borradores pendientes","drafts.noDraftsDesc":"Las respuestas borrador generadas por IA aparecerán aquí para su revisión","drafts.send":"Enviar ahora","drafts.preview":"Vista previa","drafts.dismiss":"Descartar","drafts.regenerate":"Regenerar","drafts.selectAll":"Seleccionar todo","drafts.sendSelected":"Enviar seleccionados","drafts.dismissSelected":"Descartar seleccionados","drafts.filterByAccount":"Todas las cuentas","drafts.filterByDate":"Filtrar por fecha","drafts.originalEmail":"Correo electrónico original","drafts.aiReply":"Respuesta generada por IA","drafts.createdBy":"Creado por regla:","drafts.sendSuccess":"¡Borrador enviado con éxito!","drafts.sendError":"Error al enviar el borrador","drafts.dismissSuccess":"Borrador descartado","drafts.loadError":"Error al cargar borradores","login.title":"Bienvenido de nuevo","login.subtitle":"Inicia sesión en tu agente de email con IA","login.email":"Dirección de correo electrónico","login.password":"Contraseña","login.signIn":"Iniciar sesión","login.noAccount":"¿No tienes una cuenta?","login.alreadyHaveAccount":"¿Ya tienes una cuenta?","login.signUp":"Registrarse","login.forgotPassword":"¿Olvidaste tu contraseña?","login.initialize":"Inicializar Automator","login.secureLogin":"Inicio de sesión seguro","login.firstNamePlaceholder":"Juan","login.lastNamePlaceholder":"Pérez","login.emailPlaceholder":"admin@automator.ai","login.initializeMaster":"Inicializar maestro","login.sendMagicLink":"Enviar enlace mágico","login.openDashboard":"Abrir panel de control","setup.title":"Configuración del sistema","setup.initiation":"Bienvenido","setup.coordinates":"Detalles de conexión","setup.foundation":"Configuración de base de datos","setup.ignition":"Lanzamiento","setup.start":"Iniciar configuración","setup.welcomeTitle":"Inicializando Automator","setup.welcomeSubtitle":"Configurando tu entorno especializado para inteligencia de bandeja de entrada de alta frecuencia.","setup.encryptedTitle":"Encriptado","setup.encryptedDesc":"Seguridad de datos autoalojados.","setup.turboTitle":"Turbo","setup.turboDesc":"Inferencia de IA en menos de un segundo.","setup.getStarted":"Comenzar","setup.connectionMode":"Modo de conexión","setup.selectVector":"Seleccionar modo de implementación","setup.quickIgnition":"Inicio rápido","setup.autoProvision":"Aprovisionamiento automático mediante token","setup.manualSync":"Sincronización manual","setup.existingCredentials":"Credenciales existentes","setup.abortAccess":"Abortar acceso","setup.injectCoordinates":"Ingresar credenciales existentes","setup.platformUrl":"URL de la plataforma","setup.urlHelp":"Ingrese la URL completa o solo el ID del proyecto","setup.anonMatrixKey":"Clave anónima de Supabase","setup.keyHelp":"Se encuentra en la configuración de tu proyecto Supabase","setup.back":"Atrás","setup.engage":"Conectar","setup.installation":"Instalación","setup.applyingSchema":"Configurando base de datos...","setup.emptyProject":"Proyecto vacío detectado. La inicialización es obligatoria para instalar los sistemas de IA principales.","setup.versionMismatch":"Incompatibilidad de versión detectada. Se recomienda normalización.","setup.tokenRequired":"Token de gestión requerido","setup.migrateHelp":"Se usa una vez para ejecutar migraciones en tu backend.","setup.bypassRisk":"Omitir (Arriesgado)","setup.installSystems":"Instalar sistemas","setup.normalizeSystem":"Normalizar sistema","setup.retryInstallation":"Reintentar instalación","setup.agent.systemInstruction":'Eres el asistente del Asistente de configuración. Guía al usuario para conectar Supabase, elegir un modo de configuración y completar las migraciones. Pide solo el siguiente dato requerido y ofrece pasos claros. Si el usuario dice "ayúdame a configurar", enumera inmediatamente los pasos de este asistente.',"agent.intro.setup":`👋 ¡Bienvenido a la configuración! Puedo ayudarte a:
|
|
2
|
+
• Elegir Inicio rápido o configuración manual
|
|
3
|
+
• Conectar tu proyecto de Supabase
|
|
4
|
+
• Ejecutar migraciones de base de datos
|
|
5
|
+
• Solucionar problemas de conexión
|
|
6
|
+
|
|
7
|
+
Díme qué quieres hacer o di "ayúdame a configurar".`,"agent.intro.configuration":`👋 ¡Bienvenido a la configuración! Puedo ayudarte a:
|
|
8
|
+
• Conectar cuentas de correo ({accountsCount} conectadas)
|
|
9
|
+
• Configurar reglas de automatización ({rulesCount} activas)
|
|
10
|
+
• Configurar ajustes de LLM y TTS
|
|
11
|
+
• Solucionar problemas de conexión
|
|
12
|
+
|
|
13
|
+
¿Qué te gustaría configurar?`,"agent.intro.drafts.one":`📧 ¡Soy tu asistente de revisión de borradores!
|
|
14
|
+
|
|
15
|
+
Tienes {count} borrador pendiente.
|
|
16
|
+
|
|
17
|
+
Puedo ayudarte a:
|
|
18
|
+
• Resumir todos los borradores
|
|
19
|
+
• Enviar o descartar borradores específicos
|
|
20
|
+
• Ver el contenido de los borradores
|
|
21
|
+
• Revisar destinatarios y asuntos
|
|
22
|
+
|
|
23
|
+
Intenta: "Resúmeme mis borradores" o "Envía el borrador a Juan"`,"agent.intro.drafts.other":`📧 ¡Soy tu asistente de revisión de borradores!
|
|
24
|
+
|
|
25
|
+
Tienes {count} borradores pendientes.
|
|
26
|
+
|
|
27
|
+
Puedo ayudarte a:
|
|
28
|
+
• Resumir todos los borradores
|
|
29
|
+
• Enviar o descartar borradores específicos
|
|
30
|
+
• Ver el contenido de los borradores
|
|
31
|
+
• Revisar destinatarios y asuntos
|
|
32
|
+
|
|
33
|
+
Intenta: "Resúmeme mis borradores" o "Envía el borrador a Juan"`,"agent.intro.explainer":`🌐 Asistente de traducción y explicación
|
|
34
|
+
|
|
35
|
+
Puedo ayudarte a entender:
|
|
36
|
+
• Qué significan las reglas de automatización
|
|
37
|
+
• Cómo los ajustes afectan tu flujo de trabajo
|
|
38
|
+
• Términos técnicos en lenguaje sencillo
|
|
39
|
+
|
|
40
|
+
¡Pregúntame cualquier cosa sobre lo que estás viendo!`,"agent.intro.global":`👋 ¡Hola! Soy tu asistente de IA.
|
|
41
|
+
|
|
42
|
+
Puedo ayudarte a navegar y entender cualquier parte del Email Automator.
|
|
43
|
+
|
|
44
|
+
¿Qué te gustaría saber?`,"agent.intro.default":`👋 ¡Hola! Estoy aquí para ayudarte con {page}.
|
|
45
|
+
|
|
46
|
+
¿En qué puedo ayudarte?`,"agent.composer.placeholder":"Haz una pregunta, o haz clic en el micrófono...","agent.composer.listening":"Escuchando...","agent.title.setup":"Asistente de Configuración Inicial","agent.title.configuration":"Asistente de Configuración","agent.title.drafts":"Asistente de Borradores","agent.title.explainer":"Asistente de Traducción","agent.title.global":"Asistente de IA","agent.title.default":"Asistente de {page}","agent.status.listening":"Escuchando...","agent.status.analyzing":"Analizando","agent.status.speaking":"Hablando","agent.status.ready":"Listo","agent.recording":"Grabando...","dashboard.recentAnalysis":"Análisis reciente","dashboard.emails":"correos electrónicos","dashboard.noEmails":"No se encontraron correos electrónicos","dashboard.noEmailsConnected":"Conecta tu cuenta de correo electrónico para comenzar.","dashboard.noEmailsFilters":"Intenta sincronizar o ajustar tus filtros.","dashboard.syncInProgress":"Sincronización en progreso...","dashboard.syncInProgressDesc":"Obteniendo y analizando correos electrónicos. Los nuevos correos aparecerán automáticamente a continuación.","dashboard.aiTrace":"Rastreo de procesamiento de IA","dashboard.aiTraceDesc":"Registros paso a paso de cómo la IA analizó y actuó sobre este correo electrónico.","dashboard.noTrace":"No se encontraron eventos de rastreo detallados para este correo electrónico.","dashboard.syncNow":"Sincronizar ahora","dashboard.syncing":"Sincronizando...","dashboard.searchPlaceholder":"Buscar correos electrónicos...","dashboard.search":"Buscar","dashboard.receivedTime":"Hora de recepción","dashboard.processedTime":"Hora de procesamiento","dashboard.receivedAbbr":"REC","dashboard.processedAbbr":"PROC","dashboard.sortOldest":"Ordenar: Más antiguo primero","dashboard.sortNewest":"Ordenar: Más reciente primero","dashboard.category.all":"Todos","dashboard.category.none":"ninguno","dashboard.emailDetails":"Detalles del correo electrónico","dashboard.emailContent":"Contenido del correo electrónico (enviado al LLM)","dashboard.from":"De:","dashboard.subject":"Asunto:","dashboard.summary":"Resumen:","dashboard.keyPoints":"Puntos clave:","dashboard.aiDraftReply":"Borrador de respuesta de IA","dashboard.draftSavedHelp":"* Este borrador ya está guardado en tu carpeta de Borradores de {provider}.","dashboard.syncScope":"Alcance de sincronización","dashboard.syncFrom":"Sincronizar desde","dashboard.maxEmails":"Correos electrónicos máximos","dashboard.lastSync":"Última sincronización:","dashboard.error":"Error:","dashboard.resetCheckpoint":"Restablecer punto de control (Forzar resincronización completa desde la fecha de inicio)","dashboard.syncHistory":"Historial de sincronización","dashboard.noSyncHistory":"No hay historial de sincronización disponible.","dashboard.processed":"Procesado:","dashboard.actioned":"Accionado:","dashboard.running":"En ejecución","dashboard.quickStats":"Estadísticas rápidas","dashboard.totalProcessed":"Total procesado","dashboard.connectedAccounts":"Cuentas conectadas","dashboard.activeRules":"Reglas activas","dashboard.noSubject":"Sin asunto","dashboard.queued":"En cola","dashboard.analyzing":"Analizando","dashboard.analyzed":"Analizado","dashboard.failed":"Fallido","dashboard.retryProcessing":"Reintentar procesamiento","dashboard.suggested":"Sugerido:","dashboard.done":"Hecho:","dashboard.deleteConfirm":"¿Eliminar?","dashboard.openIn":"Abrir en {provider}","dashboard.viewTraceTooltip":"Ver rastreo de IA (Prompt/Respuesta)","dashboard.syncSuccess":"¡Sincronización completada! Revisa tus correos electrónicos.","dashboard.syncFailed":"Sincronización fallida. Verifica el estado de la cuenta para más detalles.","config.title":"Automatización y reglas","config.rules":"Reglas de automatización","config.createRule":"Crear nueva regla","config.llmSettings":"Configuración de inteligencia de IA","config.accounts.title":"Cuentas de correo electrónico","config.accounts.desc":"Conectar y administrar tus cuentas de correo electrónico","config.accounts.addNew":"Agregar nueva cuenta","config.accounts.yourAccounts":"Tus cuentas conectadas","config.accounts.noAccounts":"Aún no hay cuentas de correo electrónico conectadas","config.accounts.connectHelp":"Conecta tu primera cuenta de correo electrónico para comenzar a automatizar","config.accounts.disconnect":"Desconectar","config.gmail.connect":"Conectar Gmail","config.gmail.connectDesc":"OAuth 2.0 o cuenta de servicio","config.gmail.credentialsDesc":"Pega el contenido JSON de las credenciales de Google Cloud","config.gmail.authCodeDesc":"Ingresa el código de autorización de Google","config.gmail.pasteJson":"Pega el contenido de credentials.json","config.gmail.downloadHelp":"Descarga desde Google Cloud Console → APIs & Services → Credentials","config.gmail.orEnterManually":"O ingresa manualmente","config.outlook.connect":"Conectar Outlook","config.outlook.connectDesc":"Microsoft 365 o Outlook.com","config.outlook.credentialsDesc":"Pega el contenido JSON de las credenciales de Azure App","config.outlook.instructions":"Sigue el flujo OAuth para conectarte","config.outlook.signinRequired":"Inicio de sesión requerido","config.outlook.waitingSignin":"Esperando inicio de sesión...","config.model.title":"Configuración del modelo de IA","config.model.desc":"Configura tu modelo de IA y ajustes de procesamiento","config.model.provider":"Proveedor de LLM","config.model.name":"Nombre del modelo","config.model.modelPlaceholder":"p. ej. gpt-4o-mini","config.model.selectModel":"Seleccionar un modelo","config.model.storagePath":"Ruta de almacenamiento","config.model.storagePlaceholder":"Ruta para almacenamiento del modelo","config.model.storageHelp":"Directorio local para almacenar en caché los modelos","config.model.syncInterval":"Intervalo de sincronización (minutos)","config.model.syncHelp":"Frecuencia de verificación de nuevos correos electrónicos","config.model.intelligentRename":"Renombrado inteligente","config.model.renameHelp":"Usar IA para sugerir mejores nombres de archivo","config.model.checkConnection":"Verificar conexión","config.model.saveConfig":"Guardar configuración","config.byok.title":"Trae tu propia clave (BYOK)","config.byok.desc":"Usa tus propias claves API para proveedores de IA","config.byok.systemDefault":"Usar predeterminado del sistema","config.byok.save":"Guardar clave API","config.rules.edit":"Editar regla","config.rules.create":"Crear regla","config.rules.createRule":"Crear regla","config.rules.desc":"Definir condiciones y acciones para la automatización de correo electrónico","config.rules.name":"Nombre de la regla","config.rules.namePlaceholder":"ej. Archivar boletines","config.rules.description":"Descripción","config.rules.descriptionPlaceholder":"Qué hace esta regla","config.rules.semanticHelp":"La IA coincidirá los correos electrónicos según esta descripción","config.rules.intent":"Intención","config.rules.intentPlaceholder":"Qué debería suceder cuando se active esta regla","config.rules.intentHelp":"Se usa para generar respuestas apropiadas","config.rules.conditionField":"Campo de condición","config.rules.aiAnalysis":"Análisis de IA","config.rules.metadata":"Metadatos","config.rules.category":"Categoría","config.rules.sentiment":"Sentimiento","config.rules.priority":"Prioridad","config.rules.senderEmail":"Correo electrónico del remitente","config.rules.senderDomain":"Dominio del remitente","config.rules.senderContains":"El remitente contiene","config.rules.subjectContains":"El asunto contiene","config.rules.bodyContains":"El cuerpo contiene","config.rules.equalsValue":"Valor igual","config.rules.keywordsPlaceholder":"Ingresa palabras clave...","config.rules.olderThan":"Solo si el correo electrónico es más antiguo que (días)","config.rules.olderThanHelp":"Deja vacío o 0 para aplicar inmediatamente","config.rules.performActions":"Luego realizar acciones","config.rules.draftInstructions":"Instrucciones de borrador","config.rules.contextHelp":"Contexto específico para que la IA use al redactar","config.rules.addAttachment":"Agregar archivo adjunto","config.rules.attachmentHelp":"Los archivos se adjuntarán a los borradores generados","config.rules.uploading":"Subiendo...","config.rules.saveChanges":"Guardar cambios","account.title":"Configuración de cuenta","account.subtitle":"Administra tu perfil y preferencias","account.profile":"Perfil","account.security":"Seguridad","account.database":"Supabase","account.logout":"Cerrar sesión","account.logoutSuccess":"Sesión cerrada exitosamente","account.version":"Versión","account.profile.title":"Información del perfil","account.profile.desc":"Actualiza tu información personal","account.profile.firstName":"Nombre","account.profile.firstNamePlaceholder":"Juan","account.profile.lastName":"Apellido","account.profile.lastNamePlaceholder":"Pérez","account.profile.email":"Correo electrónico","account.profile.emailHelp":"Este es tu correo electrónico de inicio de sesión y no se puede cambiar","account.profile.sounds":"Sonido y retroalimentación háptica","account.profile.soundsHelp":"Reproducir sonidos para notificaciones de correo electrónico","account.profile.soundsEnabled":"Sonidos habilitados","account.profile.soundsDisabled":"Sonidos deshabilitados","account.profile.updated":"Perfil actualizado exitosamente","account.profile.avatarUpdated":"Avatar actualizado exitosamente","account.profile.avatarError":"Error al actualizar el avatar","account.security.title":"Seguridad","account.security.desc":"Actualiza tu contraseña","account.security.newPassword":"Nueva contraseña","account.security.confirmPassword":"Confirmar contraseña","account.security.updatePassword":"Actualizar contraseña","account.security.enterPassword":"Por favor ingresa una contraseña","account.security.passwordsMismatch":"Las contraseñas no coinciden","account.security.passwordTooShort":"La contraseña debe tener al menos 6 caracteres","account.security.passwordChanged":"Contraseña cambiada exitosamente","account.database.title":"Conexión a la base de datos","account.database.desc":"Administra tu conexión Supabase","account.database.connected":"Conectado","account.database.noConnection":"Sin conexión","account.database.configureHelp":"Configura tu conexión Supabase en el asistente de configuración","account.database.anonKey":"Clave anónima","account.database.envAlert":"Conexión configurada mediante variables de entorno","account.database.changeConnection":"Cambiar conexión","account.database.clearConfig":"Borrar configuración","account.database.clearConfirm":"¿Estás seguro de que deseas borrar tu configuración de base de datos?","account.database.setup":"Configurar base de datos","trace.runTrace":"Rastreo de ejecución de sincronización","trace.fullLogFor":"Registro completo para la cuenta: {email}","trace.historicalLog":"Registro histórico para esta ejecución de sincronización.","trace.loadingTrace":"Cargando rastreo...","trace.noTraceEvents":"No se encontraron eventos de rastreo granulares para esta ejecución.","analytics.title":"Panel de analítica","analytics.totalEmails":"Total de correos electrónicos","analytics.spamCaught":"Spam capturado","analytics.actionsTaken":"Acciones tomadas","analytics.accounts":"Cuentas","analytics.categories":"Categorías de correo electrónico","analytics.recentActivity":"Actividad de sincronización reciente","analytics.noActivity":"Aún no hay actividad de sincronización","analytics.emails":"{count} correos electrónicos","analytics.deleted":"{count} eliminados","analytics.drafted":"{count} borradores","autopilot.title":"Reglas de piloto automático","autopilot.rulesEnabled":"{enabled} de {total} reglas habilitadas","autopilot.loadingRules":"Cargando reglas...","autopilot.loadError":"Error al cargar reglas","autopilot.deleteConfirm":"¿Estás seguro de que deseas eliminar esta regla?","autopilot.ruleDeleted":"Regla eliminada","autopilot.ruleDeleteFailed":"Error al eliminar regla","autopilot.ruleDeleteError":"Ocurrió un error al eliminar la regla","autopilot.ruleUpdated":"Regla actualizada","autopilot.ruleCreated":"Regla creada","autopilot.ruleUpdateFailed":"Error al actualizar regla","autopilot.ruleCreateFailed":"Error al crear regla","autopilot.ruleSaveError":"Ocurrió un error al guardar la regla","autopilot.fileUploaded":"Archivo subido","autopilot.fileUploadFailed":"Error al subir archivo","autopilot.noRulesTitle":"Aún no hay reglas","autopilot.noRulesDesc":"Las reglas se crearán automáticamente cuando te registres o conectes tu primera cuenta de correo electrónico.","autopilot.addCustomRule":"Agregar regla personalizada","autopilot.refresh":"Actualizar","autopilot.infoDesc":"Las reglas de piloto automático usan IA para organizar automáticamente tu bandeja de entrada. Activa o desactiva cualquier regla para personalizar el comportamiento.","autopilot.customRules":"Reglas personalizadas","autopilot.customRulesDesc":"Reglas que has creado manualmente","autopilot.category.email_organization.label":"Organización de correo electrónico","autopilot.category.email_organization.desc":"Organizar automáticamente tipos comunes de correo electrónico","autopilot.category.priority_alerts.label":"Prioridad y alertas","autopilot.category.priority_alerts.desc":"Resaltar mensajes urgentes e importantes","autopilot.category.development.label":"Desarrollo","autopilot.category.development.desc":"Notificaciones de GitHub, CI/CD y herramientas de desarrollo","autopilot.category.sales_business.label":"Ventas y negocios","autopilot.category.sales_business.desc":"Gestión de clientes potenciales y comunicaciones comerciales","autopilot.category.operations.label":"Operaciones","autopilot.category.operations.desc":"Soporte, solicitudes internas y alertas del sistema","autopilot.enabledCount":"({enabled}/{total} habilitadas)","autopilot.badge":"Piloto automático","autopilot.editRuleTooltip":"Editar regla","autopilot.deleteRuleTooltip":"Eliminar regla","autopilot.triggeredToday":"{count} hoy","autopilot.editDialog.editTitle":"Editar regla","autopilot.editDialog.createTitle":"Crear regla personalizada","autopilot.editDialog.desc":"Definir una condición basada en el análisis de IA para activar una acción.","autopilot.editDialog.ruleName":"Nombre de la regla","autopilot.editDialog.namePlaceholder":"ej. Archivar boletines","autopilot.editDialog.description":"Descripción","autopilot.editDialog.descPlaceholder":"ej. Manejar todos los boletines de marketing y contenido promocional de servicios de suscripción","autopilot.editDialog.descriptionHelp":"Describe para qué es esta regla. La IA usa esto para hacer coincidir semánticamente los correos electrónicos.","autopilot.editDialog.intent":"Intención","autopilot.editDialog.intentPlaceholder":"ej. Rechazar cortésmente todas las propuestas de ventas","autopilot.editDialog.intentHelp":"El objetivo de esta regla. Se usa para generar borradores de respuesta apropiados.","autopilot.editDialog.conditionField":"Campo de condición Si","autopilot.editDialog.aiAnalysisGroup":"Análisis de IA","autopilot.editDialog.metadataGroup":"Metadatos","autopilot.editDialog.category":"Categoría","autopilot.editDialog.sentiment":"Sentimiento","autopilot.editDialog.priority":"Prioridad","autopilot.editDialog.senderEmail":"Correo electrónico específico (Exacto)","autopilot.editDialog.senderDomain":"Dominio de correo electrónico (@...)","autopilot.editDialog.senderContains":"El remitente contiene...","autopilot.editDialog.subjectContains":"El asunto contiene...","autopilot.editDialog.bodyContains":"El cuerpo contiene...","autopilot.editDialog.equalsValue":"Valor igual","autopilot.editDialog.cat.newsletter":"Boletín","autopilot.editDialog.cat.news":"Noticias","autopilot.editDialog.cat.spam":"Spam","autopilot.editDialog.cat.promotional":"Promocional","autopilot.editDialog.cat.transactional":"Transaccional","autopilot.editDialog.cat.social":"Social","autopilot.editDialog.cat.support":"Soporte","autopilot.editDialog.cat.client":"Cliente","autopilot.editDialog.cat.internal":"Interno","autopilot.editDialog.cat.personal":"Personal","autopilot.editDialog.cat.other":"Otro","autopilot.editDialog.sent.positive":"Positivo","autopilot.editDialog.sent.neutral":"Neutral","autopilot.editDialog.sent.negative":"Negativo","autopilot.editDialog.prio.high":"Alto","autopilot.editDialog.prio.medium":"Medio","autopilot.editDialog.prio.low":"Bajo","autopilot.editDialog.keywordsPlaceholder":"Palabras clave...","autopilot.editDialog.olderThan":"Solo si el correo electrónico es más antiguo que... (Opcional)","autopilot.editDialog.days":"días","autopilot.editDialog.olderThanHelp":"Deja vacío o 0 para aplicar la regla inmediatamente al recibirlo.","autopilot.editDialog.performActions":"Luego realizar acción(es)","autopilot.editDialog.actionsDesc":"Selecciona una o más acciones para ejecutar cuando la regla coincida","autopilot.editDialog.action.archive":"Archivar correo electrónico","autopilot.editDialog.action.delete":"Eliminar correo electrónico","autopilot.editDialog.action.draft":"Borrador de respuesta","autopilot.editDialog.action.star":"Estrella / Marcar","autopilot.editDialog.draftInstructions":"Instrucciones de borrador (Contexto)","autopilot.editDialog.draftInstPlaceholder":"ej. Diles que estoy ocupado hasta el viernes, pero interesado en la propuesta.","autopilot.editDialog.draftInstHelp":"Contexto específico para el escritor fantasma de IA.","autopilot.editDialog.attachments":"Archivos adjuntos (Opcional)","autopilot.editDialog.uploading":"Subiendo...","autopilot.editDialog.addAttachment":"Agregar archivo adjunto","autopilot.editDialog.attachmentsHelp":"Los archivos se adjuntarán a cada borrador generado por esta regla.","autopilot.onboarding.allSet":"¡Todo listo!","autopilot.onboarding.enabledDesc":"Hemos habilitado {count} reglas de automatización para ti","autopilot.onboarding.rules":"reglas","autopilot.onboarding.universalDesc":"Reglas esenciales que ayudan a todos a mantenerse organizados","autopilot.onboarding.executiveDesc":"Enfocarse en comunicaciones de alta prioridad y asuntos estratégicos","autopilot.onboarding.developerDesc":"Resaltar alertas críticas y filtrar ruido de herramientas","autopilot.onboarding.salesDesc":"Priorizar clientes potenciales y comunicaciones con clientes","autopilot.onboarding.operationsDesc":"Organizar tickets y comunicaciones internas","autopilot.onboarding.tip":"Consejo: Todas las reglas están habilitadas por defecto, pero puedes personalizarlas o deshabilitarlas en cualquier momento en la sección de Piloto automático.","autopilot.onboarding.start":"Comenzar a usar Email Automator →","autopilot.role.title":"¡Un último paso!","autopilot.role.subtitle":"¿Qué describe mejor tu rol? Configuraremos las reglas de automatización adecuadas para ti.","autopilot.role.executive.label":"Ejecutivo / Liderazgo","autopilot.role.executive.desc":"Enfocarse en VIP, contratos y comunicaciones estratégicas","autopilot.role.executive.preview":"Priorizador de clientes VIP;Organizador de viajes;Legal y contratos","autopilot.role.sales.label":"Ventas / Desarrollo de negocios","autopilot.role.sales.desc":"Priorizar clientes potenciales y comunicaciones con clientes","autopilot.role.sales.preview":"Preguntas de clientes;Organizador de CRM;Seguimiento de propuestas","autopilot.role.developer.label":"Desarrollador / Ingeniero","autopilot.role.developer.desc":"Resaltar alertas críticas y filtrar ruido de herramientas","autopilot.role.developer.preview":"Alertas del sistema;Revisiones de código;Gestión de proyectos","autopilot.role.operations.label":"Operaciones / Soporte","autopilot.role.operations.desc":"Organizar tickets y comunicaciones internas","autopilot.role.operations.preview":"Tickets de soporte;Monitoreo del sistema;Comunicaciones internas","autopilot.role.marketing.label":"Marketing","autopilot.role.marketing.desc":"Seguir campañas y participación de clientes","autopilot.role.marketing.preview":"Seguimiento de campañas;Informes de analítica;Redes sociales","autopilot.role.other.label":"Otro / Configuración manual","autopilot.role.other.desc":"Configuraré mis propias reglas de automatización","autopilot.role.includes":"Incluye:","autopilot.role.skip":"Omitir por ahora","autopilot.role.settingUp":"Configurando...","autopilot.role.continue":"Continuar →","terminal.title":"Terminal del agente","terminal.liveActivity":"Actividad en vivo","terminal.syncing":"SINCRONIZANDO","terminal.live":"EN VIVO","terminal.stopSync":"DETENER SINCRONIZACIÓN","terminal.clear":"Borrar","terminal.waiting":"Esperando actividad del agente...","terminal.details":"Detalles","terminal.useless":"INÚTIL","terminal.relevant":"RELEVANTE","terminal.executionComplete":"Ejecución completada","terminal.batchFinished":"Sincronización por lotes finalizada","terminal.processed":"Procesado","terminal.actions":"Acciones","terminal.action.delete":"Movido a la papelera","terminal.action.archive":"Correo electrónico archivado","terminal.action.draft":"Borrador de respuesta creado","terminal.action.star":"Correo electrónico marcado con estrella","common.edit":"Editar","persona.title":"Persona Digital","persona.subtitle":"Gestiona cómo tu asistente de IA te representa.","persona.identity":"Identidad","persona.communication":"Comunicación","persona.automation":"Automatización","persona.network":"Red","persona.edit.title":"Editar Persona","persona.edit.desc":"Actualiza las preferencias de tu asistente digital.","config.outlook.openLogin":"Abrir inicio de sesión de Microsoft","config.llm.title":"LLM","config.model.defaultProvider":"RealTimeX AI (predeterminado)","config.model.discovering":"Descubriendo...","config.storage.title":"Ruta de almacenamiento","config.storage.desc":"Elige dónde se almacenan localmente los archivos de correo sin procesar","config.storage.label":"Ruta de almacenamiento local","config.storage.placeholder":"p. ej. /Users/you/Documents/email-archive","config.storage.help":"Debe tener permisos de escritura. Déjalo en blanco para usar la carpeta predeterminada de la aplicación.","config.rename.title":"Renombrado inteligente","config.rename.desc":"Controla el formato de nombres de archivo para los correos almacenados","config.rename.label":"Habilitar renombrado inteligente","config.rename.help":"Crea nombres legibles y con slug en lugar de ID de mensaje sin formato.","config.sync.title":"Intervalo de sincronización (minutos)","config.sync.desc":"Controla cada cuánto se ejecuta la sincronización en segundo plano","config.sync.label":"Minutos entre sincronizaciones","config.sync.help":"Valores más bajos aumentan la frescura pero pueden usar más recursos.","config.embed.title":"Embeddings (RAG)","config.embed.desc":"Configura embeddings para la búsqueda en la base de conocimiento (RAG).","config.embed.provider":"Proveedor de embeddings","config.embed.model":"Modelo de embeddings","config.embed.modelPlaceholder":"p. ej. text-embedding-3-small","config.embed.autoModel":"Auto (text-embedding-3-small)","config.embed.help":"Se usa para la búsqueda semántica en la base de conocimiento.","config.embed.discovering":"Descubriendo...","config.embed.defaultProvider":"RealTimeX AI (predeterminado)","config.byok.googleTitle":"Google / Gmail","config.byok.microsoftTitle":"Microsoft / Outlook","config.byok.clientId":"ID de cliente","config.byok.clientSecret":"Secreto de cliente","config.byok.clientSecretOptional":"Secreto de cliente (opcional)","config.byok.tenantId":"ID de inquilino","config.voice.title":"Voz y habla","config.voice.desc":"Configura texto a voz para las respuestas de IA","config.voice.autoTitle":"Auto‑hablar respuestas de IA","config.voice.autoHelp":"Leer automáticamente en voz alta las respuestas de la IA con texto a voz","config.voice.provider":"Proveedor TTS","config.voice.providerHelp":"Selecciona el proveedor de texto a voz","config.voice.loadingProviders":"Cargando proveedores...","config.voice.voice":"Voz","config.voice.selectVoice":"Selecciona una voz","config.voice.noVoices":"No hay voces disponibles","config.voice.voiceHelp":"Elige la personalidad de voz para la síntesis","config.voice.speed":"Velocidad","config.voice.speedSlow":"0.5x (Más lento)","config.voice.speedFast":"2.0x (Más rápido)","config.voice.quality":"Calidad","config.voice.qualityLow":"1 (Menor calidad, más rápido)","config.voice.qualityHigh":"20 (Mayor calidad, más lento)","config.voice.test":"Probar","config.voice.save":"Guardar ajustes","config.voice.testText":"¡Hola! Esta es una prueba del sistema de texto a voz.","config.voice.piperLocal":"Piper (Local)","config.voice.toast.providersFailed":"No se pudieron cargar los proveedores TTS. Asegúrate de que RealTimeX Desktop esté en ejecución.","config.voice.toast.serviceFailed":"No se pudo conectar al servicio TTS","config.voice.toast.testFailed":"No se pudo probar el texto a voz","config.voice.toast.saved":"Ajustes de voz y habla guardados","config.voice.toast.saveFailed":"No se pudieron guardar los ajustes","config.voice.toast.autoOn":"Auto‑hablar respuestas de IA activado","config.voice.toast.autoOff":"Auto‑hablar respuestas de IA desactivado","config.voice.toast.updateFailed":"No se pudo actualizar el ajuste","config.agent.systemInstruction":"Eres el asistente de configuración. Guía al usuario para configurar cuentas, reglas y preferencias del sistema. Explica cada ajuste y ayuda a solucionar conexiones.","config.toast.providersFailed":"No se pudieron cargar los proveedores","config.toast.providersFailedFallback":"No se pudieron cargar los proveedores. Se usan los valores predeterminados.","config.toast.embedProvidersFailed":"No se pudieron cargar los proveedores de embeddings","config.toast.embedProvidersFailedFallback":"No se pudieron cargar los proveedores de embeddings. Se usan los valores predeterminados.","config.toast.connectionFailed":"Conexión fallida","config.toast.systemRuleMissing":"Regla del sistema no encontrada. Sincroniza tu base de datos.","config.toast.startConnectionFailed":"No se pudo iniciar la conexión. Asegúrate de haber iniciado sesión.","config.toast.startGmailFailed":"No se pudo iniciar la conexión con Gmail","config.toast.detectedDesktopCreds":"Se detectaron credenciales de app de escritorio","config.toast.detectedWebCreds":"Se detectó una app web. Asegúrate de configurar el URI de redirección en Google Cloud Console","config.toast.missingGmailCreds":"Proporciona el ID de cliente y el secreto de cliente","config.toast.authorizeAndPaste":"Autoriza en la pestaña abierta y luego pega el código aquí","config.toast.oauthUrlFailed":"No se pudo obtener la URL de OAuth","config.toast.saveCredsFailed":"No se pudieron guardar las credenciales","config.toast.missingAuthCode":"Pega el código de autorización","config.toast.gmailConnected":"¡Cuenta de Gmail conectada correctamente!","config.toast.gmailConnectFailed":"No se pudo conectar Gmail","config.toast.missingOutlookClientId":"Proporciona el ID de cliente","config.toast.deviceFlowFailed":"No se pudo iniciar el flujo de dispositivo","config.toast.outlookStartFailed":"No se pudo iniciar la conexión con Outlook","config.toast.outlookConnected":"Cuenta de Outlook conectada","config.toast.connectionTimedOut":"La conexión agotó el tiempo. Inténtalo de nuevo.","config.toast.ruleNameRequired":"Asigna un nombre a tu regla","config.toast.ruleActionRequired":"Selecciona al menos una acción","config.toast.ruleUpdated":"Regla actualizada","config.toast.ruleCreated":"Regla creada","config.toast.ruleUpdateFailed":"No se pudo actualizar la regla","config.toast.ruleCreateFailed":"No se pudo crear la regla","config.toast.ruleSaveError":"Ocurrió un error al guardar la regla","config.toast.disconnectConfirm":"¿Seguro que quieres desconectar esta cuenta?","config.toast.accountDisconnected":"Cuenta desconectada","config.toast.settingsSaved":"Ajustes guardados","config.toast.fileUploaded":"Archivo subido","config.toast.fileUploadFailed":"No se pudo subir el archivo","config.providers.gmail":"Gmail","config.providers.outlook":"Outlook","config.gmail.authSteps":`1. Se abrió una nueva pestaña con Google Sign-In
|
|
47
|
+
2. Inicia sesión y autoriza la app
|
|
48
|
+
3. Copia el código de autorización mostrado
|
|
49
|
+
4. Pégalo abajo`,"config.gmail.authCode":"Código de autorización","config.gmail.clientIdPlaceholder":"xxx.apps.googleusercontent.com","config.gmail.clientSecretPlaceholder":"GOCSPX-...","config.gmail.authCodePlaceholder":"4/0AQlEd8x...","config.rules.actionsHelp":"Selecciona una o más acciones para ejecutar cuando la regla coincida","config.rules.instructionsPlaceholder":"p. ej. Diles que estoy ocupado hasta el viernes, pero interesado en la propuesta.","config.rules.attachmentsOptional":"Adjuntos (opcional)","config.rules.days":"días","config.rules.placeholder.domain":"rta.vn","config.rules.placeholder.email":"john@example.com","config.rules.category.newsletter":"Boletín","config.rules.category.spam":"Spam","config.rules.category.promotional":"Promocional","config.rules.category.transactional":"Transaccional","config.rules.category.social":"Social","config.rules.category.support":"Soporte","config.rules.category.client":"Cliente","config.rules.category.internal":"Interno","config.rules.category.personal":"Personal","config.rules.category.other":"Otro","config.rules.sentiment.positive":"Positivo","config.rules.sentiment.neutral":"Neutral","config.rules.sentiment.negative":"Negativo","config.rules.priority.high":"Alta","config.rules.priority.medium":"Media","config.rules.priority.low":"Baja","config.outlook.note":"Nota: Necesitas un registro de aplicación de Azure para que funcione.","config.outlook.clientId":"ID de cliente (ID de la aplicación)","config.outlook.tenantIdOptional":"ID de inquilino (opcional)","config.outlook.tenantHelp":'El valor predeterminado es "common". Usa tu ID de inquilino específico para cuentas de organización.',"config.outlook.saveConnect":"Guardar y conectar","config.outlook.actionRequired":"Acción requerida","config.outlook.waitingAuth":"Esperando autorización...","config.outlook.tenantPlaceholder":"common"};export{e as default};
|