{"repo": "abhimanyugit2507/quoteboterp", "files": {"backend/.env.example": {"05c4d63d2658bc49bf6b0aa4758746878e0c9d29": {"t": 1785747078.227009, "n": 8616, "h": "339a58405e71b35d", "c": "# Quotebot Backend - Environment Variables Template\n# Copy this file to .env and update values for your environment\n\n# ============================================\n# DATABASE CONFIGURATION\n# ============================================\n# PostgreSQL Connection String\n# Format: postgresql://[user]:[password]@[host]:[port]/[database]\nDATABASE_URL=\"postgresql://postgres:postgres@localhost:5432/quotebot_db\"\n\n# ============================================\n# JWT CONFIGURATION\n# ============================================\n# Secret key for signing JWT tokens\n# IMPORTANT: Use a strong random string (minimum 32 characters) in production\n# Generate one with: openssl rand -base64 32\nJWT_SECRET=dev-secret-do-not-use-in-production\n\n# Token expiration time\n# Supported formats: \"2h\", \"24h\", \"7d\", or seconds number\nJWT_EXPIRATION=\"24h\"\n\n# Refresh token secret and expiration\n# Leave secret blank to reuse JWT_SECRET in development\nJWT_REFRESH_SECRET=dev-refresh-secret-do-not-use-in-production\nJWT_REFRESH_EXPIRATION=\"14d\"\n\n# Cookie settings for auth tokens\n# AUTH_COOKIE_DOMAIN can be blank for localhost\nAUTH_COOKIE_DOMAIN=\"\"\n# Set true when using https in production\nAUTH_COOKIE_SECURE=\"false\"\n# lax | strict | none\nAUTH_COOKIE_SAMESITE=\"lax\"\n\n# ============================================\n# API CONFIGURATION\n# ============================================\n# Port the API server will listen on\nAPI_PORT=3001\n\n# Base path prefix for all API routes\n# With this setting, endpoints will be at /api/...\nAPI_PREFIX=\"api\"\n\n# CORS allowed origins (comma-separated)\n# Add your frontend URL here\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n\n# Internal automation auth (used by automation scripts -> backend calls)\nINTERNAL_API_KEY=\"replace-with-strong-internal-key\"\n\n# ============================================\n# FILE UPLOAD CONFIGURATION\n# ============================================\n# Directory where uploaded files will be stored\n# Create this directory if it doesn't exist, or update the path\nUPLOAD_FOLDER=\"/tmp/quotebot-uploads\"\n\n# Maximum file size in bytes (5MB = 5242880)\nMAX_FILE_SIZE=5242880\n\n# ============================================\n# ENVIRONMENT\n# ============================================\n# Node environment\n# Use \"development\" for local development with logging\n# Use \"production\" for deployed instances\nNODE_ENV=\"development\"\n\n# ============================================\n# GMAIL OAUTH (EMAIL INTEGRATION)\n# ============================================\n# Values come from your Google OAuth client JSON file\nGMAIL_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGMAIL_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGMAIL_REDIRECT_URI=\"http://localhost:3001/api/email-integrations/oauth/callback\"\n\n# ============================================\n# GOOGLE OAUTH LOGIN (PLATFORM AUTH)\n# ============================================\n# Reuse the same Google OAuth client or provide a separate one for app sign-in\nGOOGLE_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGOOGLE_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGOOGLE_REDIRECT_URI=\"http://localhost:3001/api/auth/google/callback\"\n\n# ============================================\n# ACCOUNTING INTEGRATIONS (Xero / QuickBooks)\n# ============================================\n# Xero OAuth credentials\nXERO_CLIENT_ID=\"your-xero-client-id\"\nXERO_CLIENT_SECRET=\"your-xero-client-secret\"\nXERO_TENANT_ID=\"your-xero-tenant-id\"\nXERO_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/xero/callback\"\nXERO_SCOPES=\"offline_access accounting.transactions openid profile email\"\nXERO_SALES_ACCOUNT_CODE=\"200\"\n\n# QuickBooks OAuth credentials\nQUICKBOOKS_CLIENT_ID=\"your-quickbooks-client-id\"\nQUICKBOOKS_CLIENT_SECRET=\"your-quickbooks-client-secret\"\nQUICKBOOKS_REALM_ID=\"your-quickbooks-realm-id\"\nQUICKBOOKS_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/quickbooks/callback\"\nQUICKBOOKS_SCOPES=\"com.intuit.quickbooks.accounting openid profile email\"\n\n# ============================================\n# LLM PROVIDERS (RFQ PIPELINE FALLBACK ORDER)\n# ============================================\n# Fallback order used by email-rfq service\n# Default order in code is groq,mistral,gemini,openrouter,cerebras,together,deepseek\nRFQ_LLM_FALLBACK_ORDER=\"groq,mistral,gemini,openrouter,cerebras,together,deepseek\"\n\n# RFQ classifier snippet tuning (helps pack more emails per LLM call)\nRFQ_CLASSIFIER_SNIPPET_HEAD_CHARS=200\nRFQ_CLASSIFIER_SNIPPET_MAX_CHARS=600\nRFQ_CLASSIFIER_KEYWORD_WINDOW_CHARS=40\nRFQ_CLASSIFIER_MAX_WINDOWS=4\nRFQ_CLASSIFIER_MAX_BATCH_BYTES=26000\n\n# RFQ timing metrics window (days)\nRFQ_TIMING_WINDOW_DAYS=30\n\n# Shared retry controls for provider calls\nRFQ_LLM_MAX_RETRIES=2\nRFQ_LLM_RETRY_BASE_MS=1000\n\n# -------- Together AI --------\nTOGETHER_API_KEY=\"your-together-api-key\"\nTOGETHER_BASE_URL=\"https://api.together.xyz/v1\"\nTOGETHER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# Optional per-task overrides:\n# TOGETHER_CLASSIFIER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# TOGETHER_EXTRACTION_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n\n# -------- Mistral AI --------\nMISTRAL_API_KEY=\"your-mistral-api-key\"\nMISTRAL_BASE_URL=\"https://api.mistral.ai/v1\"\nMISTRAL_MODEL=\"open-mistral-nemo\"\n# Optional per-task overrides:\n# MISTRAL_CLASSIFIER_MODEL=\"open-mistral-nemo\"\n# MISTRAL_EXTRACTION_MODEL=\"open-mistral-nemo\"\n\n# -------- DeepSeek --------\nDEEPSEEK_API_KEY=\"your-deepseek-api-key\"\nDEEPSEEK_BASE_URL=\"https://api.deepseek.com\"\nDEEPSEEK_MODEL=\"deepseek-chat\"\n# Optional per-task overrides:\n# DEEPSEEK_CLASSIFIER_MODEL=\"deepseek-chat\"\n# DEEPSEEK_EXTRACTION_MODEL=\"deepseek-chat\"\n\n# -------- OpenRouter (optional provider) --------\nOPENROUTER_API_KEY=\"your-openrouter-api-key\"\nOPENROUTER_BASE_URL=\"https://openrouter.ai/api/v1/chat/completions\"\nOPENROUTER_MODEL=\"openrouter/owl-alpha\"\n# Optional per-task overrides:\n# OPENROUTER_CLASSIFIER_MODEL=\"openrouter/owl-alpha\"\n# OPENROUTER_EXTRACTION_MODEL=\"openrouter/owl-alpha\"\n\n# -------- Groq (1st fallback by default) --------\nGROQ_API_KEY=\"your-groq-api-key\"\nGROQ_BASE_URL=\"https://api.groq.com/openai/v1\"\nGROQ_MODEL=\"openai/gpt-oss-20b\"\n# Optional per-task overrides:\n# GROQ_CLASSIFIER_MODEL=\"openai/gpt-oss-20b\"\n# GROQ_EXTRACTION_MODEL=\"openai/gpt-oss-20b\"\n\n# -------- Cerebras (2nd fallback by default) --------\nCEREBRAS_API_KEY=\"your-cerebras-api-key\"\nCEREBRAS_BASE_URL=\"https://api.cerebras.ai/v1\"\nCEREBRAS_MODEL=\"gpt-oss-120b\"\n# Optional per-task overrides:\n# CEREBRAS_CLASSIFIER_MODEL=\"gpt-oss-120b\"\n# CEREBRAS_EXTRACTION_MODEL=\"gpt-oss-120b\"\n\n# -------- Gemini (3rd fallback by default) --------\nGEMINI_API_KEY=\"your-gemini-api-key\"\nGEMINI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/models\"\nGEMINI_MODEL=\"gemini-2.5-flash-lite\"\n# Optional per-task overrides:\n# GEMINI_CLASSIFIER_MODEL=\"gemini-2.5-flash-lite\"\n# GEMINI_EXTRACTION_MODEL=\"gemini-2.5-flash-lite\"\n\n# ============================================\n# OPTIONAL: DATABASE LOGGING (Development Only)\n# ============================================\n# Set DATABASE_LOG=true to see SQL queries in console during development\n# DATABASE_LOG=\"true\"\n\n# ============================================\n# REDIS (Bull job queue)\n# ============================================\n# Redis connection URL for Bull job queues\nREDIS_URL=redis://localhost:6379\n\n# ============================================\n# GMAIL PUB/SUB PUSH NOTIFICATIONS (optional)\n# ============================================\n# Create a Pub/Sub topic in Google Cloud Console, then set its full resource name here.\n# Format: projects//topics/\n# Leave blank to use polling fallback only.\nGMAIL_PUBSUB_TOPIC=\n\n# ============================================\n# OUTLOOK / OFFICE 365 INTEGRATION\n# ============================================\n# Register an app in Azure Active Directory (App registrations)\n# Grant permissions: Mail.Read, Mail.Send, offline_access\nOUTLOOK_CLIENT_ID=\nOUTLOOK_CLIENT_SECRET=\nOUTLOOK_REDIRECT_URI=http://localhost:3001/api/email-integrations/outlook/callback\n# Use 'common' for multi-tenant, or your specific tenant GUID/domain\nOUTLOOK_TENANT=common\n\n# ============================================\n# META (WhatsApp Business API)\n# ============================================\n# Create a Meta app at https://developers.facebook.com\n# Enable WhatsApp product and get credentials from the dashboard\nMETA_WHATSAPP_APP_ID=\nMETA_WHATSAPP_APP_SECRET=\n# A secret string you choose; must match what you enter in the Meta webhook verification step\nMETA_WHATSAPP_VERIFY_TOKEN=\nMETA_WHATSAPP_REDIRECT_URI=http://localhost:3001/api/whatsapp/meta/callback\n"}, "fe710ec2b5d8f935a23385d2b8d21575a304f425": {"t": 1785770280.5613067, "n": 8616, "h": "339a58405e71b35d", "c": "# Quotebot Backend - Environment Variables Template\n# Copy this file to .env and update values for your environment\n\n# ============================================\n# DATABASE CONFIGURATION\n# ============================================\n# PostgreSQL Connection String\n# Format: postgresql://[user]:[password]@[host]:[port]/[database]\nDATABASE_URL=\"postgresql://postgres:postgres@localhost:5432/quotebot_db\"\n\n# ============================================\n# JWT CONFIGURATION\n# ============================================\n# Secret key for signing JWT tokens\n# IMPORTANT: Use a strong random string (minimum 32 characters) in production\n# Generate one with: openssl rand -base64 32\nJWT_SECRET=dev-secret-do-not-use-in-production\n\n# Token expiration time\n# Supported formats: \"2h\", \"24h\", \"7d\", or seconds number\nJWT_EXPIRATION=\"24h\"\n\n# Refresh token secret and expiration\n# Leave secret blank to reuse JWT_SECRET in development\nJWT_REFRESH_SECRET=dev-refresh-secret-do-not-use-in-production\nJWT_REFRESH_EXPIRATION=\"14d\"\n\n# Cookie settings for auth tokens\n# AUTH_COOKIE_DOMAIN can be blank for localhost\nAUTH_COOKIE_DOMAIN=\"\"\n# Set true when using https in production\nAUTH_COOKIE_SECURE=\"false\"\n# lax | strict | none\nAUTH_COOKIE_SAMESITE=\"lax\"\n\n# ============================================\n# API CONFIGURATION\n# ============================================\n# Port the API server will listen on\nAPI_PORT=3001\n\n# Base path prefix for all API routes\n# With this setting, endpoints will be at /api/...\nAPI_PREFIX=\"api\"\n\n# CORS allowed origins (comma-separated)\n# Add your frontend URL here\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n\n# Internal automation auth (used by automation scripts -> backend calls)\nINTERNAL_API_KEY=\"replace-with-strong-internal-key\"\n\n# ============================================\n# FILE UPLOAD CONFIGURATION\n# ============================================\n# Directory where uploaded files will be stored\n# Create this directory if it doesn't exist, or update the path\nUPLOAD_FOLDER=\"/tmp/quotebot-uploads\"\n\n# Maximum file size in bytes (5MB = 5242880)\nMAX_FILE_SIZE=5242880\n\n# ============================================\n# ENVIRONMENT\n# ============================================\n# Node environment\n# Use \"development\" for local development with logging\n# Use \"production\" for deployed instances\nNODE_ENV=\"development\"\n\n# ============================================\n# GMAIL OAUTH (EMAIL INTEGRATION)\n# ============================================\n# Values come from your Google OAuth client JSON file\nGMAIL_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGMAIL_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGMAIL_REDIRECT_URI=\"http://localhost:3001/api/email-integrations/oauth/callback\"\n\n# ============================================\n# GOOGLE OAUTH LOGIN (PLATFORM AUTH)\n# ============================================\n# Reuse the same Google OAuth client or provide a separate one for app sign-in\nGOOGLE_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGOOGLE_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGOOGLE_REDIRECT_URI=\"http://localhost:3001/api/auth/google/callback\"\n\n# ============================================\n# ACCOUNTING INTEGRATIONS (Xero / QuickBooks)\n# ============================================\n# Xero OAuth credentials\nXERO_CLIENT_ID=\"your-xero-client-id\"\nXERO_CLIENT_SECRET=\"your-xero-client-secret\"\nXERO_TENANT_ID=\"your-xero-tenant-id\"\nXERO_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/xero/callback\"\nXERO_SCOPES=\"offline_access accounting.transactions openid profile email\"\nXERO_SALES_ACCOUNT_CODE=\"200\"\n\n# QuickBooks OAuth credentials\nQUICKBOOKS_CLIENT_ID=\"your-quickbooks-client-id\"\nQUICKBOOKS_CLIENT_SECRET=\"your-quickbooks-client-secret\"\nQUICKBOOKS_REALM_ID=\"your-quickbooks-realm-id\"\nQUICKBOOKS_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/quickbooks/callback\"\nQUICKBOOKS_SCOPES=\"com.intuit.quickbooks.accounting openid profile email\"\n\n# ============================================\n# LLM PROVIDERS (RFQ PIPELINE FALLBACK ORDER)\n# ============================================\n# Fallback order used by email-rfq service\n# Default order in code is groq,mistral,gemini,openrouter,cerebras,together,deepseek\nRFQ_LLM_FALLBACK_ORDER=\"groq,mistral,gemini,openrouter,cerebras,together,deepseek\"\n\n# RFQ classifier snippet tuning (helps pack more emails per LLM call)\nRFQ_CLASSIFIER_SNIPPET_HEAD_CHARS=200\nRFQ_CLASSIFIER_SNIPPET_MAX_CHARS=600\nRFQ_CLASSIFIER_KEYWORD_WINDOW_CHARS=40\nRFQ_CLASSIFIER_MAX_WINDOWS=4\nRFQ_CLASSIFIER_MAX_BATCH_BYTES=26000\n\n# RFQ timing metrics window (days)\nRFQ_TIMING_WINDOW_DAYS=30\n\n# Shared retry controls for provider calls\nRFQ_LLM_MAX_RETRIES=2\nRFQ_LLM_RETRY_BASE_MS=1000\n\n# -------- Together AI --------\nTOGETHER_API_KEY=\"your-together-api-key\"\nTOGETHER_BASE_URL=\"https://api.together.xyz/v1\"\nTOGETHER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# Optional per-task overrides:\n# TOGETHER_CLASSIFIER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# TOGETHER_EXTRACTION_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n\n# -------- Mistral AI --------\nMISTRAL_API_KEY=\"your-mistral-api-key\"\nMISTRAL_BASE_URL=\"https://api.mistral.ai/v1\"\nMISTRAL_MODEL=\"open-mistral-nemo\"\n# Optional per-task overrides:\n# MISTRAL_CLASSIFIER_MODEL=\"open-mistral-nemo\"\n# MISTRAL_EXTRACTION_MODEL=\"open-mistral-nemo\"\n\n# -------- DeepSeek --------\nDEEPSEEK_API_KEY=\"your-deepseek-api-key\"\nDEEPSEEK_BASE_URL=\"https://api.deepseek.com\"\nDEEPSEEK_MODEL=\"deepseek-chat\"\n# Optional per-task overrides:\n# DEEPSEEK_CLASSIFIER_MODEL=\"deepseek-chat\"\n# DEEPSEEK_EXTRACTION_MODEL=\"deepseek-chat\"\n\n# -------- OpenRouter (optional provider) --------\nOPENROUTER_API_KEY=\"your-openrouter-api-key\"\nOPENROUTER_BASE_URL=\"https://openrouter.ai/api/v1/chat/completions\"\nOPENROUTER_MODEL=\"openrouter/owl-alpha\"\n# Optional per-task overrides:\n# OPENROUTER_CLASSIFIER_MODEL=\"openrouter/owl-alpha\"\n# OPENROUTER_EXTRACTION_MODEL=\"openrouter/owl-alpha\"\n\n# -------- Groq (1st fallback by default) --------\nGROQ_API_KEY=\"your-groq-api-key\"\nGROQ_BASE_URL=\"https://api.groq.com/openai/v1\"\nGROQ_MODEL=\"openai/gpt-oss-20b\"\n# Optional per-task overrides:\n# GROQ_CLASSIFIER_MODEL=\"openai/gpt-oss-20b\"\n# GROQ_EXTRACTION_MODEL=\"openai/gpt-oss-20b\"\n\n# -------- Cerebras (2nd fallback by default) --------\nCEREBRAS_API_KEY=\"your-cerebras-api-key\"\nCEREBRAS_BASE_URL=\"https://api.cerebras.ai/v1\"\nCEREBRAS_MODEL=\"gpt-oss-120b\"\n# Optional per-task overrides:\n# CEREBRAS_CLASSIFIER_MODEL=\"gpt-oss-120b\"\n# CEREBRAS_EXTRACTION_MODEL=\"gpt-oss-120b\"\n\n# -------- Gemini (3rd fallback by default) --------\nGEMINI_API_KEY=\"your-gemini-api-key\"\nGEMINI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/models\"\nGEMINI_MODEL=\"gemini-2.5-flash-lite\"\n# Optional per-task overrides:\n# GEMINI_CLASSIFIER_MODEL=\"gemini-2.5-flash-lite\"\n# GEMINI_EXTRACTION_MODEL=\"gemini-2.5-flash-lite\"\n\n# ============================================\n# OPTIONAL: DATABASE LOGGING (Development Only)\n# ============================================\n# Set DATABASE_LOG=true to see SQL queries in console during development\n# DATABASE_LOG=\"true\"\n\n# ============================================\n# REDIS (Bull job queue)\n# ============================================\n# Redis connection URL for Bull job queues\nREDIS_URL=redis://localhost:6379\n\n# ============================================\n# GMAIL PUB/SUB PUSH NOTIFICATIONS (optional)\n# ============================================\n# Create a Pub/Sub topic in Google Cloud Console, then set its full resource name here.\n# Format: projects//topics/\n# Leave blank to use polling fallback only.\nGMAIL_PUBSUB_TOPIC=\n\n# ============================================\n# OUTLOOK / OFFICE 365 INTEGRATION\n# ============================================\n# Register an app in Azure Active Directory (App registrations)\n# Grant permissions: Mail.Read, Mail.Send, offline_access\nOUTLOOK_CLIENT_ID=\nOUTLOOK_CLIENT_SECRET=\nOUTLOOK_REDIRECT_URI=http://localhost:3001/api/email-integrations/outlook/callback\n# Use 'common' for multi-tenant, or your specific tenant GUID/domain\nOUTLOOK_TENANT=common\n\n# ============================================\n# META (WhatsApp Business API)\n# ============================================\n# Create a Meta app at https://developers.facebook.com\n# Enable WhatsApp product and get credentials from the dashboard\nMETA_WHATSAPP_APP_ID=\nMETA_WHATSAPP_APP_SECRET=\n# A secret string you choose; must match what you enter in the Meta webhook verification step\nMETA_WHATSAPP_VERIFY_TOKEN=\nMETA_WHATSAPP_REDIRECT_URI=http://localhost:3001/api/whatsapp/meta/callback\n"}, "689b8f36f598767a1caa3d52b47b079fa9108692": {"t": 1785770282.023795, "n": 7115, "h": "ea6ce4b12b618fb4", "c": "# Quotebot Backend - Environment Variables Template\n# Copy this file to .env and update values for your environment\n\n# ============================================\n# DATABASE CONFIGURATION\n# ============================================\n# PostgreSQL Connection String\n# Format: postgresql://[user]:[password]@[host]:[port]/[database]\nDATABASE_URL=\"postgresql://postgres:postgres@localhost:5432/quotebot_db\"\n\n# ============================================\n# JWT CONFIGURATION\n# ============================================\n# Secret key for signing JWT tokens\n# IMPORTANT: Use a strong random string (minimum 32 characters) in production\n# Generate one with: openssl rand -base64 32\nJWT_SECRET=dev-secret-do-not-use-in-production\n\n# Token expiration time\n# Supported formats: \"2h\", \"24h\", \"7d\", or seconds number\nJWT_EXPIRATION=\"24h\"\n\n# Refresh token secret and expiration\n# Leave secret blank to reuse JWT_SECRET in development\nJWT_REFRESH_SECRET=dev-refresh-secret-do-not-use-in-production\nJWT_REFRESH_EXPIRATION=\"14d\"\n\n# Cookie settings for auth tokens\n# AUTH_COOKIE_DOMAIN can be blank for localhost\nAUTH_COOKIE_DOMAIN=\"\"\n# Set true when using https in production\nAUTH_COOKIE_SECURE=\"false\"\n# lax | strict | none\nAUTH_COOKIE_SAMESITE=\"lax\"\n\n# ============================================\n# API CONFIGURATION\n# ============================================\n# Port the API server will listen on\nAPI_PORT=3001\n\n# Base path prefix for all API routes\n# With this setting, endpoints will be at /api/...\nAPI_PREFIX=\"api\"\n\n# CORS allowed origins (comma-separated)\n# Add your frontend URL here\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n\n# Internal automation auth (used by automation scripts -> backend calls)\nINTERNAL_API_KEY=\"replace-with-strong-internal-key\"\n\n# ============================================\n# FILE UPLOAD CONFIGURATION\n# ============================================\n# Directory where uploaded files will be stored\n# Create this directory if it doesn't exist, or update the path\nUPLOAD_FOLDER=\"/tmp/quotebot-uploads\"\n\n# Maximum file size in bytes (5MB = 5242880)\nMAX_FILE_SIZE=5242880\n\n# ============================================\n# ENVIRONMENT\n# ============================================\n# Node environment\n# Use \"development\" for local development with logging\n# Use \"production\" for deployed instances\nNODE_ENV=\"development\"\n\n# ============================================\n# GMAIL OAUTH (EMAIL INTEGRATION)\n# ============================================\n# Values come from your Google OAuth client JSON file\nGMAIL_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGMAIL_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGMAIL_REDIRECT_URI=\"http://localhost:3001/api/email-integrations/oauth/callback\"\n\n# ============================================\n# GOOGLE OAUTH LOGIN (PLATFORM AUTH)\n# ============================================\n# Reuse the same Google OAuth client or provide a separate one for app sign-in\nGOOGLE_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGOOGLE_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGOOGLE_REDIRECT_URI=\"http://localhost:3001/api/auth/google/callback\"\n\n# ============================================\n# ACCOUNTING INTEGRATIONS (Xero / QuickBooks)\n# ============================================\n# Xero OAuth credentials\nXERO_CLIENT_ID=\"your-xero-client-id\"\nXERO_CLIENT_SECRET=\"your-xero-client-secret\"\nXERO_TENANT_ID=\"your-xero-tenant-id\"\nXERO_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/xero/callback\"\nXERO_SCOPES=\"offline_access accounting.transactions openid profile email\"\nXERO_SALES_ACCOUNT_CODE=\"200\"\n\n# QuickBooks OAuth credentials\nQUICKBOOKS_CLIENT_ID=\"your-quickbooks-client-id\"\nQUICKBOOKS_CLIENT_SECRET=\"your-quickbooks-client-secret\"\nQUICKBOOKS_REALM_ID=\"your-quickbooks-realm-id\"\nQUICKBOOKS_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/quickbooks/callback\"\nQUICKBOOKS_SCOPES=\"com.intuit.quickbooks.accounting openid profile email\"\n\n# ============================================\n# LLM PROVIDERS (RFQ PIPELINE FALLBACK ORDER)\n# ============================================\n# Fallback order used by email-rfq service\n# Default order in code is groq,mistral,gemini,openrouter,cerebras,together,deepseek\nRFQ_LLM_FALLBACK_ORDER=\"groq,mistral,gemini,openrouter,cerebras,together,deepseek\"\n\n# RFQ classifier snippet tuning (helps pack more emails per LLM call)\nRFQ_CLASSIFIER_SNIPPET_HEAD_CHARS=200\nRFQ_CLASSIFIER_SNIPPET_MAX_CHARS=600\nRFQ_CLASSIFIER_KEYWORD_WINDOW_CHARS=40\nRFQ_CLASSIFIER_MAX_WINDOWS=4\nRFQ_CLASSIFIER_MAX_BATCH_BYTES=26000\n\n# RFQ timing metrics window (days)\nRFQ_TIMING_WINDOW_DAYS=30\n\n# Shared retry controls for provider calls\nRFQ_LLM_MAX_RETRIES=2\nRFQ_LLM_RETRY_BASE_MS=1000\n\n# -------- Together AI --------\nTOGETHER_API_KEY=\"your-together-api-key\"\nTOGETHER_BASE_URL=\"https://api.together.xyz/v1\"\nTOGETHER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# Optional per-task overrides:\n# TOGETHER_CLASSIFIER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# TOGETHER_EXTRACTION_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n\n# -------- Mistral AI --------\nMISTRAL_API_KEY=\"your-mistral-api-key\"\nMISTRAL_BASE_URL=\"https://api.mistral.ai/v1\"\nMISTRAL_MODEL=\"open-mistral-nemo\"\n# Optional per-task overrides:\n# MISTRAL_CLASSIFIER_MODEL=\"open-mistral-nemo\"\n# MISTRAL_EXTRACTION_MODEL=\"open-mistral-nemo\"\n\n# -------- DeepSeek --------\nDEEPSEEK_API_KEY=\"your-deepseek-api-key\"\nDEEPSEEK_BASE_URL=\"https://api.deepseek.com\"\nDEEPSEEK_MODEL=\"deepseek-chat\"\n# Optional per-task overrides:\n# DEEPSEEK_CLASSIFIER_MODEL=\"deepseek-chat\"\n# DEEPSEEK_EXTRACTION_MODEL=\"deepseek-chat\"\n\n# -------- OpenRouter (optional provider) --------\nOPENROUTER_API_KEY=\"your-openrouter-api-key\"\nOPENROUTER_BASE_URL=\"https://openrouter.ai/api/v1/chat/completions\"\nOPENROUTER_MODEL=\"openrouter/owl-alpha\"\n# Optional per-task overrides:\n# OPENROUTER_CLASSIFIER_MODEL=\"openrouter/owl-alpha\"\n# OPENROUTER_EXTRACTION_MODEL=\"openrouter/owl-alpha\"\n\n# -------- Groq (1st fallback by default) --------\nGROQ_API_KEY=\"your-groq-api-key\"\nGROQ_BASE_URL=\"https://api.groq.com/openai/v1\"\nGROQ_MODEL=\"openai/gpt-oss-20b\"\n# Optional per-task overrides:\n# GROQ_CLASSIFIER_MODEL=\"openai/gpt-oss-20b\"\n# GROQ_EXTRACTION_MODEL=\"openai/gpt-oss-20b\"\n\n# -------- Cerebras (2nd fallback by default) --------\nCEREBRAS_API_KEY=\"your-cerebras-api-key\"\nCEREBRAS_BASE_URL=\"https://api.cerebras.ai/v1\"\nCEREBRAS_MODEL=\"gpt-oss-120b\"\n# Optional per-task overrides:\n# CEREBRAS_CLASSIFIER_MODEL=\"gpt-oss-120b\"\n# CEREBRAS_EXTRACTION_MODEL=\"gpt-oss-120b\"\n\n# -------- Gemini (3rd fallback by default) --------\nGEMINI_API_KEY=\"your-gemini-api-key\"\nGEMINI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/models\"\nGEMINI_MODEL=\"gemini-2.5-flash-lite\"\n# Optional per-task overrides:\n# GEMINI_CLASSIFIER_MODEL=\"gemini-2.5-flash-lite\"\n# GEMINI_EXTRACTION_MODEL=\"gemini-2.5-flash-lite\"\n\n# ============================================\n# OPTIONAL: DATABASE LOGGING (Development Only)\n# ============================================\n# Set DATABASE_LOG=true to see SQL queries in console during development\n# DATABASE_LOG=\"true\"\n"}, "ed2cf2d407fa00ca846c816f938ef7aa778f7f03": {"t": 1785770283.2593677, "n": 7109, "h": "eb08029408a85e36", "c": "# Quotebot Backend - Environment Variables Template\n# Copy this file to .env and update values for your environment\n\n# ============================================\n# DATABASE CONFIGURATION\n# ============================================\n# PostgreSQL Connection String\n# Format: postgresql://[user]:[password]@[host]:[port]/[database]\nDATABASE_URL=\"postgresql://postgres:postgres@localhost:5432/quotebot_db\"\n\n# ============================================\n# JWT CONFIGURATION\n# ============================================\n# Secret key for signing JWT tokens\n# IMPORTANT: Use a strong random string (minimum 32 characters) in production\n# Generate one with: openssl rand -base64 32\nJWT_SECRET=\"your-super-secret-jwt-key-change-this-in-production-minimum-32-chars\"\n\n# Token expiration time\n# Supported formats: \"2h\", \"24h\", \"7d\", or seconds number\nJWT_EXPIRATION=\"24h\"\n\n# Refresh token secret and expiration\n# Leave secret blank to reuse JWT_SECRET in development\nJWT_REFRESH_SECRET=\"\"\nJWT_REFRESH_EXPIRATION=\"14d\"\n\n# Cookie settings for auth tokens\n# AUTH_COOKIE_DOMAIN can be blank for localhost\nAUTH_COOKIE_DOMAIN=\"\"\n# Set true when using https in production\nAUTH_COOKIE_SECURE=\"false\"\n# lax | strict | none\nAUTH_COOKIE_SAMESITE=\"lax\"\n\n# ============================================\n# API CONFIGURATION\n# ============================================\n# Port the API server will listen on\nAPI_PORT=3001\n\n# Base path prefix for all API routes\n# With this setting, endpoints will be at /api/...\nAPI_PREFIX=\"api\"\n\n# CORS allowed origins (comma-separated)\n# Add your frontend URL here\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n\n# Internal automation auth (used by automation scripts -> backend calls)\nINTERNAL_API_KEY=\"replace-with-strong-internal-key\"\n\n# ============================================\n# FILE UPLOAD CONFIGURATION\n# ============================================\n# Directory where uploaded files will be stored\n# Create this directory if it doesn't exist, or update the path\nUPLOAD_FOLDER=\"/tmp/quotebot-uploads\"\n\n# Maximum file size in bytes (5MB = 5242880)\nMAX_FILE_SIZE=5242880\n\n# ============================================\n# ENVIRONMENT\n# ============================================\n# Node environment\n# Use \"development\" for local development with logging\n# Use \"production\" for deployed instances\nNODE_ENV=\"development\"\n\n# ============================================\n# GMAIL OAUTH (EMAIL INTEGRATION)\n# ============================================\n# Values come from your Google OAuth client JSON file\nGMAIL_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGMAIL_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGMAIL_REDIRECT_URI=\"http://localhost:3001/api/email-integrations/oauth/callback\"\n\n# ============================================\n# GOOGLE OAUTH LOGIN (PLATFORM AUTH)\n# ============================================\n# Reuse the same Google OAuth client or provide a separate one for app sign-in\nGOOGLE_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGOOGLE_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGOOGLE_REDIRECT_URI=\"http://localhost:3001/api/auth/google/callback\"\n\n# ============================================\n# ACCOUNTING INTEGRATIONS (Xero / QuickBooks)\n# ============================================\n# Xero OAuth credentials\nXERO_CLIENT_ID=\"your-xero-client-id\"\nXERO_CLIENT_SECRET=\"your-xero-client-secret\"\nXERO_TENANT_ID=\"your-xero-tenant-id\"\nXERO_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/xero/callback\"\nXERO_SCOPES=\"offline_access accounting.transactions openid profile email\"\nXERO_SALES_ACCOUNT_CODE=\"200\"\n\n# QuickBooks OAuth credentials\nQUICKBOOKS_CLIENT_ID=\"your-quickbooks-client-id\"\nQUICKBOOKS_CLIENT_SECRET=\"your-quickbooks-client-secret\"\nQUICKBOOKS_REALM_ID=\"your-quickbooks-realm-id\"\nQUICKBOOKS_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/quickbooks/callback\"\nQUICKBOOKS_SCOPES=\"com.intuit.quickbooks.accounting openid profile email\"\n\n# ============================================\n# LLM PROVIDERS (RFQ PIPELINE FALLBACK ORDER)\n# ============================================\n# Fallback order used by email-rfq service\n# Default order in code is groq,mistral,gemini,openrouter,cerebras,together,deepseek\nRFQ_LLM_FALLBACK_ORDER=\"groq,mistral,gemini,openrouter,cerebras,together,deepseek\"\n\n# RFQ classifier snippet tuning (helps pack more emails per LLM call)\nRFQ_CLASSIFIER_SNIPPET_HEAD_CHARS=200\nRFQ_CLASSIFIER_SNIPPET_MAX_CHARS=600\nRFQ_CLASSIFIER_KEYWORD_WINDOW_CHARS=40\nRFQ_CLASSIFIER_MAX_WINDOWS=4\nRFQ_CLASSIFIER_MAX_BATCH_BYTES=26000\n\n# RFQ timing metrics window (days)\nRFQ_TIMING_WINDOW_DAYS=30\n\n# Shared retry controls for provider calls\nRFQ_LLM_MAX_RETRIES=2\nRFQ_LLM_RETRY_BASE_MS=1000\n\n# -------- Together AI --------\nTOGETHER_API_KEY=\"your-together-api-key\"\nTOGETHER_BASE_URL=\"https://api.together.xyz/v1\"\nTOGETHER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# Optional per-task overrides:\n# TOGETHER_CLASSIFIER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# TOGETHER_EXTRACTION_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n\n# -------- Mistral AI --------\nMISTRAL_API_KEY=\"your-mistral-api-key\"\nMISTRAL_BASE_URL=\"https://api.mistral.ai/v1\"\nMISTRAL_MODEL=\"open-mistral-nemo\"\n# Optional per-task overrides:\n# MISTRAL_CLASSIFIER_MODEL=\"open-mistral-nemo\"\n# MISTRAL_EXTRACTION_MODEL=\"open-mistral-nemo\"\n\n# -------- DeepSeek --------\nDEEPSEEK_API_KEY=\"your-deepseek-api-key\"\nDEEPSEEK_BASE_URL=\"https://api.deepseek.com\"\nDEEPSEEK_MODEL=\"deepseek-chat\"\n# Optional per-task overrides:\n# DEEPSEEK_CLASSIFIER_MODEL=\"deepseek-chat\"\n# DEEPSEEK_EXTRACTION_MODEL=\"deepseek-chat\"\n\n# -------- OpenRouter (optional provider) --------\nOPENROUTER_API_KEY=\"your-openrouter-api-key\"\nOPENROUTER_BASE_URL=\"https://openrouter.ai/api/v1/chat/completions\"\nOPENROUTER_MODEL=\"openrouter/owl-alpha\"\n# Optional per-task overrides:\n# OPENROUTER_CLASSIFIER_MODEL=\"openrouter/owl-alpha\"\n# OPENROUTER_EXTRACTION_MODEL=\"openrouter/owl-alpha\"\n\n# -------- Groq (1st fallback by default) --------\nGROQ_API_KEY=\"your-groq-api-key\"\nGROQ_BASE_URL=\"https://api.groq.com/openai/v1\"\nGROQ_MODEL=\"openai/gpt-oss-20b\"\n# Optional per-task overrides:\n# GROQ_CLASSIFIER_MODEL=\"openai/gpt-oss-20b\"\n# GROQ_EXTRACTION_MODEL=\"openai/gpt-oss-20b\"\n\n# -------- Cerebras (2nd fallback by default) --------\nCEREBRAS_API_KEY=\"your-cerebras-api-key\"\nCEREBRAS_BASE_URL=\"https://api.cerebras.ai/v1\"\nCEREBRAS_MODEL=\"gpt-oss-120b\"\n# Optional per-task overrides:\n# CEREBRAS_CLASSIFIER_MODEL=\"gpt-oss-120b\"\n# CEREBRAS_EXTRACTION_MODEL=\"gpt-oss-120b\"\n\n# -------- Gemini (3rd fallback by default) --------\nGEMINI_API_KEY=\"your-gemini-api-key\"\nGEMINI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/models\"\nGEMINI_MODEL=\"gemini-2.5-flash-lite\"\n# Optional per-task overrides:\n# GEMINI_CLASSIFIER_MODEL=\"gemini-2.5-flash-lite\"\n# GEMINI_EXTRACTION_MODEL=\"gemini-2.5-flash-lite\"\n\n# ============================================\n# OPTIONAL: DATABASE LOGGING (Development Only)\n# ============================================\n# Set DATABASE_LOG=true to see SQL queries in console during development\n# DATABASE_LOG=\"true\"\n"}, "2b2246587b043c6b0283cfe3251b154ca55107ec": {"t": 1785770284.7399685, "n": 7088, "h": "dcdda24c7502a404", "c": "# Quotebot Backend - Environment Variables Template\n# Copy this file to .env and update values for your environment\n\n# ============================================\n# DATABASE CONFIGURATION\n# ============================================\n# PostgreSQL Connection String\n# Format: postgresql://[user]:[password]@[host]:[port]/[database]\nDATABASE_URL=\"postgresql://postgres:postgres@localhost:5432/quotebot_db\"\n\n# ============================================\n# JWT CONFIGURATION\n# ============================================\n# Secret key for signing JWT tokens\n# IMPORTANT: Use a strong random string (minimum 32 characters) in production\n# Generate one with: openssl rand -base64 32\nJWT_SECRET=\"your-super-secret-jwt-key-change-this-in-production-minimum-32-chars\"\n\n# Token expiration time\n# Supported formats: \"2h\", \"24h\", \"7d\", or seconds number\nJWT_EXPIRATION=\"24h\"\n\n# Refresh token secret and expiration\n# Leave secret blank to reuse JWT_SECRET in development\nJWT_REFRESH_SECRET=\"\"\nJWT_REFRESH_EXPIRATION=\"14d\"\n\n# Cookie settings for auth tokens\n# AUTH_COOKIE_DOMAIN can be blank for localhost\nAUTH_COOKIE_DOMAIN=\"\"\n# Set true when using https in production\nAUTH_COOKIE_SECURE=\"false\"\n# lax | strict | none\nAUTH_COOKIE_SAMESITE=\"lax\"\n\n# ============================================\n# API CONFIGURATION\n# ============================================\n# Port the API server will listen on\nAPI_PORT=3001\n\n# Base path prefix for all API routes\n# With this setting, endpoints will be at /api/...\nAPI_PREFIX=\"api\"\n\n# CORS allowed origins (comma-separated)\n# Add your frontend URL here\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n\n# Internal automation auth (used by n8n -> backend calls)\nN8N_SECRET=\"replace-with-strong-internal-key\"\n\n# ============================================\n# FILE UPLOAD CONFIGURATION\n# ============================================\n# Directory where uploaded files will be stored\n# Create this directory if it doesn't exist, or update the path\nUPLOAD_FOLDER=\"/tmp/quotebot-uploads\"\n\n# Maximum file size in bytes (5MB = 5242880)\nMAX_FILE_SIZE=5242880\n\n# ============================================\n# ENVIRONMENT\n# ============================================\n# Node environment\n# Use \"development\" for local development with logging\n# Use \"production\" for deployed instances\nNODE_ENV=\"development\"\n\n# ============================================\n# GMAIL OAUTH (EMAIL INTEGRATION)\n# ============================================\n# Values come from your Google OAuth client JSON file\nGMAIL_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGMAIL_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGMAIL_REDIRECT_URI=\"http://localhost:3001/api/email-integrations/oauth/callback\"\n\n# ============================================\n# GOOGLE OAUTH LOGIN (PLATFORM AUTH)\n# ============================================\n# Reuse the same Google OAuth client or provide a separate one for app sign-in\nGOOGLE_CLIENT_ID=\"your-google-oauth-client-id.apps.googleusercontent.com\"\nGOOGLE_CLIENT_SECRET=\"your-google-oauth-client-secret\"\nGOOGLE_REDIRECT_URI=\"http://localhost:3001/api/auth/google/callback\"\n\n# ============================================\n# ACCOUNTING INTEGRATIONS (Xero / QuickBooks)\n# ============================================\n# Xero OAuth credentials\nXERO_CLIENT_ID=\"your-xero-client-id\"\nXERO_CLIENT_SECRET=\"your-xero-client-secret\"\nXERO_TENANT_ID=\"your-xero-tenant-id\"\nXERO_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/xero/callback\"\nXERO_SCOPES=\"offline_access accounting.transactions openid profile email\"\nXERO_SALES_ACCOUNT_CODE=\"200\"\n\n# QuickBooks OAuth credentials\nQUICKBOOKS_CLIENT_ID=\"your-quickbooks-client-id\"\nQUICKBOOKS_CLIENT_SECRET=\"your-quickbooks-client-secret\"\nQUICKBOOKS_REALM_ID=\"your-quickbooks-realm-id\"\nQUICKBOOKS_REDIRECT_URI=\"http://localhost:3001/api/integrations/accounting/quickbooks/callback\"\nQUICKBOOKS_SCOPES=\"com.intuit.quickbooks.accounting openid profile email\"\n\n# ============================================\n# LLM PROVIDERS (RFQ PIPELINE FALLBACK ORDER)\n# ============================================\n# Fallback order used by email-rfq service\n# Default order in code is groq,mistral,gemini,openrouter,cerebras,together,deepseek\nRFQ_LLM_FALLBACK_ORDER=\"groq,mistral,gemini,openrouter,cerebras,together,deepseek\"\n\n# RFQ classifier snippet tuning (helps pack more emails per LLM call)\nRFQ_CLASSIFIER_SNIPPET_HEAD_CHARS=200\nRFQ_CLASSIFIER_SNIPPET_MAX_CHARS=600\nRFQ_CLASSIFIER_KEYWORD_WINDOW_CHARS=40\nRFQ_CLASSIFIER_MAX_WINDOWS=4\nRFQ_CLASSIFIER_MAX_BATCH_BYTES=26000\n\n# RFQ timing metrics window (days)\nRFQ_TIMING_WINDOW_DAYS=30\n\n# Shared retry controls for provider calls\nRFQ_LLM_MAX_RETRIES=2\nRFQ_LLM_RETRY_BASE_MS=1000\n\n# -------- Together AI --------\nTOGETHER_API_KEY=\"your-together-api-key\"\nTOGETHER_BASE_URL=\"https://api.together.xyz/v1\"\nTOGETHER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# Optional per-task overrides:\n# TOGETHER_CLASSIFIER_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n# TOGETHER_EXTRACTION_MODEL=\"mistralai/Mistral-Nemo-Instruct-2407\"\n\n# -------- Mistral AI --------\nMISTRAL_API_KEY=\"your-mistral-api-key\"\nMISTRAL_BASE_URL=\"https://api.mistral.ai/v1\"\nMISTRAL_MODEL=\"open-mistral-nemo\"\n# Optional per-task overrides:\n# MISTRAL_CLASSIFIER_MODEL=\"open-mistral-nemo\"\n# MISTRAL_EXTRACTION_MODEL=\"open-mistral-nemo\"\n\n# -------- DeepSeek --------\nDEEPSEEK_API_KEY=\"your-deepseek-api-key\"\nDEEPSEEK_BASE_URL=\"https://api.deepseek.com\"\nDEEPSEEK_MODEL=\"deepseek-chat\"\n# Optional per-task overrides:\n# DEEPSEEK_CLASSIFIER_MODEL=\"deepseek-chat\"\n# DEEPSEEK_EXTRACTION_MODEL=\"deepseek-chat\"\n\n# -------- OpenRouter (optional provider) --------\nOPENROUTER_API_KEY=\"your-openrouter-api-key\"\nOPENROUTER_BASE_URL=\"https://openrouter.ai/api/v1/chat/completions\"\nOPENROUTER_MODEL=\"openrouter/owl-alpha\"\n# Optional per-task overrides:\n# OPENROUTER_CLASSIFIER_MODEL=\"openrouter/owl-alpha\"\n# OPENROUTER_EXTRACTION_MODEL=\"openrouter/owl-alpha\"\n\n# -------- Groq (1st fallback by default) --------\nGROQ_API_KEY=\"your-groq-api-key\"\nGROQ_BASE_URL=\"https://api.groq.com/openai/v1\"\nGROQ_MODEL=\"openai/gpt-oss-20b\"\n# Optional per-task overrides:\n# GROQ_CLASSIFIER_MODEL=\"openai/gpt-oss-20b\"\n# GROQ_EXTRACTION_MODEL=\"openai/gpt-oss-20b\"\n\n# -------- Cerebras (2nd fallback by default) --------\nCEREBRAS_API_KEY=\"your-cerebras-api-key\"\nCEREBRAS_BASE_URL=\"https://api.cerebras.ai/v1\"\nCEREBRAS_MODEL=\"gpt-oss-120b\"\n# Optional per-task overrides:\n# CEREBRAS_CLASSIFIER_MODEL=\"gpt-oss-120b\"\n# CEREBRAS_EXTRACTION_MODEL=\"gpt-oss-120b\"\n\n# -------- Gemini (3rd fallback by default) --------\nGEMINI_API_KEY=\"your-gemini-api-key\"\nGEMINI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/models\"\nGEMINI_MODEL=\"gemini-2.5-flash-lite\"\n# Optional per-task overrides:\n# GEMINI_CLASSIFIER_MODEL=\"gemini-2.5-flash-lite\"\n# GEMINI_EXTRACTION_MODEL=\"gemini-2.5-flash-lite\"\n\n# ============================================\n# OPTIONAL: DATABASE LOGGING (Development Only)\n# ============================================\n# Set DATABASE_LOG=true to see SQL queries in console during development\n# DATABASE_LOG=\"true\"\n"}, "d8cdf688f60f525de4d16cd76fe367765ee42a3e": {"t": 1785770287.2949824, "n": 2095, "h": "a522b7748abcf5ed", "c": "# Quotebot Backend - Environment Variables Template\n# Copy this file to .env and update values for your environment\n\n# ============================================\n# DATABASE CONFIGURATION\n# ============================================\n# PostgreSQL Connection String\n# Format: postgresql://[user]:[password]@[host]:[port]/[database]\nDATABASE_URL=\"postgresql://postgres:postgres@localhost:5432/quotebot_db\"\n\n# ============================================\n# JWT CONFIGURATION\n# ============================================\n# Secret key for signing JWT tokens\n# IMPORTANT: Use a strong random string (minimum 32 characters) in production\n# Generate one with: openssl rand -base64 32\nJWT_SECRET=\"your-super-secret-jwt-key-change-this-in-production-minimum-32-chars\"\n\n# Token expiration time\n# Supported formats: \"2h\", \"24h\", \"7d\", or seconds number\nJWT_EXPIRATION=\"24h\"\n\n# ============================================\n# API CONFIGURATION\n# ============================================\n# Port the API server will listen on\nAPI_PORT=3001\n\n# Base path prefix for all API routes\n# With this setting, endpoints will be at /api/...\nAPI_PREFIX=\"api\"\n\n# CORS allowed origins (comma-separated)\n# Add your frontend URL here\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n\n# ============================================\n# FILE UPLOAD CONFIGURATION\n# ============================================\n# Directory where uploaded files will be stored\n# Create this directory if it doesn't exist, or update the path\nUPLOAD_FOLDER=\"/tmp/quotebot-uploads\"\n\n# Maximum file size in bytes (5MB = 5242880)\nMAX_FILE_SIZE=5242880\n\n# ============================================\n# ENVIRONMENT\n# ============================================\n# Node environment\n# Use \"development\" for local development with logging\n# Use \"production\" for deployed instances\nNODE_ENV=\"development\"\n\n# ============================================\n# OPTIONAL: DATABASE LOGGING (Development Only)\n# ============================================\n# Set DATABASE_LOG=true to see SQL queries in console during development\n# DATABASE_LOG=\"true\"\n"}}}}