UI nova dentro do Construtor (Hermes) — TabBar com Chat e Verificação. Verificação roda HermesBuilder::Validator (DB+runtime) e exibe resultado agrupado por categoria, com botão Refazer inline em FAIL/WARN reparáveis. Backend (porta dos checks DB do CLI bin/hermes-validate): - HermesBuilder::Validator com 22+ checks: engine, profile, port, secret, parent, unit, Brand, CaptainInbox sync (o bug que travou Juliana), pricing dry-run, Inter creds, typing/response_delay, registry MCP completo. - HermesBuilder::Repairer com 4 handlers automáticos: set_engine_hermes, sync_captain_inbox_unit, set_default_typing_delay, set_default_response_delay. - Endpoints novos: GET assistants, GET validate?slug=, POST repair. Frontend: - builder/Index.vue: wrapper com TabBar. - builder/BuilderChat.vue: extraído do Index original. - builder/BuilderVerification.vue: dropdown + Conferir agora + lista agrupada por categoria com badges + botão Refazer inline. i18n: keys em pt_BR e en sob CAPTAIN_HERMES_BUILDER.VERIFY.*. Filesystem/systemd checks ficam pro CLI hermes-validate (Rails container não enxerga /root/.hermes/profiles do host). Validado HTTP: GET /validate?slug=juliana_qnn1 → 28 PASS / 0 FAIL / 1 WARN. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
939 lines
34 KiB
JSON
939 lines
34 KiB
JSON
{
|
||
"CAPTAIN_RESERVATIONS": {
|
||
"HEADER": "Reservations",
|
||
"EMPTY": "No reservations found.",
|
||
"CREATE_SUCCESS": "Reservation successfully created.",
|
||
"CREATE_ERROR": "Failed to create reservation.",
|
||
"NEW_RESERVATION_MODAL": {
|
||
"TITLE": "New Reservation",
|
||
"CONFIRM": "Create Reservation",
|
||
"CANCEL": "Cancel",
|
||
"FIELDS": {
|
||
"CONTACT_ID": "Contact ID",
|
||
"CONTACT_ID_PLACEHOLDER": "Enter the contact ID",
|
||
"INBOX": "Inbox",
|
||
"INBOX_PLACEHOLDER": "Select an inbox",
|
||
"STATUS": "Reservation Status",
|
||
"STATUS_PLACEHOLDER": "Select status",
|
||
"SUITE_IDENTIFIER": "Suite Identifier (Ex: 101, Master Suite)",
|
||
"CHECK_IN": "Check-in",
|
||
"CHECK_OUT": "Check-out",
|
||
"TOTAL_AMOUNT": "Total Amount"
|
||
}
|
||
},
|
||
"VIEW": {
|
||
"LIST": "List",
|
||
"KANBAN": "Kanban",
|
||
"REVENUE": "Revenue"
|
||
},
|
||
"FILTERS": {
|
||
"SEARCH": "Search by name, CPF, or phone",
|
||
"STATUS": "Status",
|
||
"STATUS_ALL": "All statuses",
|
||
"UNIT": "Unit",
|
||
"UNIT_ALL": "All units",
|
||
"SUITE": "Suite",
|
||
"DATE_FROM": "From",
|
||
"DATE_TO": "To",
|
||
"SORT": "Sort",
|
||
"SORT_DEFAULT": "Operational priority",
|
||
"SORT_CHECK_IN": "Check-in date",
|
||
"SORT_UPDATED": "Last update",
|
||
"SORT_CREATED": "Created at",
|
||
"APPLY": "Apply filters",
|
||
"CLEAR": "Clear filters",
|
||
"HIDE": "Hide filters"
|
||
},
|
||
"KPI": {
|
||
"TOTAL": "Total on page",
|
||
"PENDING_PIX": "Awaiting PIX",
|
||
"CHECKIN_TODAY": "Check-in today",
|
||
"REVENUE_TODAY": "Revenue today"
|
||
},
|
||
"PILLS": {
|
||
"ALL": "All",
|
||
"DRAFT": "Draft",
|
||
"PENDING_PAYMENT": "Awaiting PIX",
|
||
"CONFIRMED": "Confirmed",
|
||
"CANCELLED": "Cancelled"
|
||
},
|
||
"QUICK_DATE": {
|
||
"TODAY": "Today",
|
||
"TOMORROW": "Tomorrow",
|
||
"WEEK": "7 days",
|
||
"ALL": "All"
|
||
},
|
||
"CARD": {
|
||
"CHECK_IN": "Check-in",
|
||
"AMOUNT": "Amount",
|
||
"TODAY": "Today",
|
||
"TOMORROW": "Tomorrow",
|
||
"YESTERDAY": "Yesterday",
|
||
"PIX_EXPIRED": "Expired",
|
||
"PIX_EXPIRES_IN_MIN": "Expires in {minutes}min",
|
||
"PIX_EXPIRES_IN_HR": "Expires in {hours}h"
|
||
},
|
||
"TABLE": {
|
||
"CUSTOMER": "Customer",
|
||
"UNIT": "Unit",
|
||
"SUITE": "Suite",
|
||
"CHECK_IN": "Check-in",
|
||
"AMOUNT": "Amount",
|
||
"STATUS": "Status",
|
||
"UPDATED_AT": "Updated",
|
||
"ACTIONS": "Actions"
|
||
},
|
||
"STATUS": {
|
||
"SCHEDULED": "Scheduled",
|
||
"PENDING_PAYMENT": "Awaiting payment",
|
||
"ACTIVE": "Active",
|
||
"CONFIRMED": "Confirmed",
|
||
"COMPLETED": "Completed",
|
||
"CANCELLED": "Cancelled",
|
||
"DRAFT": "Draft"
|
||
},
|
||
"ACTIONS": {
|
||
"OPEN_CONVERSATION": "Open conversation",
|
||
"COPY_PIX": "Copy Pix",
|
||
"MORE": "More",
|
||
"REGENERATE_PIX": "Resend PIX",
|
||
"MARK_AS_PAID": "Mark as paid",
|
||
"MARK_AS_PAID_CONFIRM": "Mark this reservation as manually paid?",
|
||
"MARKED_AS_PAID": "Reservation marked as paid.",
|
||
"MARK_AS_PAID_FAILED": "Failed to mark as paid.",
|
||
"CANCEL": "Cancel reservation",
|
||
"CANCEL_REASON_PROMPT": "Cancellation reason (optional):",
|
||
"CANCELLED": "Reservation cancelled.",
|
||
"CANCEL_FAILED": "Failed to cancel.",
|
||
"PIX_REGENERATED": "New PIX generated and sent.",
|
||
"PIX_REGENERATE_FAILED": "Failed to resend PIX."
|
||
},
|
||
"KANBAN": {
|
||
"EMPTY_COLUMN": "No reservations in this status."
|
||
},
|
||
"REVENUE": {
|
||
"ONLY_CONFIRMED": "Revenue includes only reservations with confirmed status.",
|
||
"SUMMARY": {
|
||
"TOTAL_REVENUE": "Total revenue",
|
||
"CONFIRMED_COUNT": "Confirmed reservations",
|
||
"AVERAGE_TICKET": "Average ticket"
|
||
},
|
||
"CHARTS": {
|
||
"BY_UNIT": "Revenue by unit",
|
||
"BY_SUITE": "Revenue by suite"
|
||
},
|
||
"API": {
|
||
"ERROR": "Unable to load revenue."
|
||
}
|
||
},
|
||
"SIDEBAR": {
|
||
"NO_RESERVATION": "No reservation linked to this conversation.",
|
||
"LOADING": "Loading reservation details...",
|
||
"STATUS": "Status",
|
||
"SUITE": "Suite",
|
||
"CHECK_IN": "Check-in",
|
||
"CHECK_OUT": "Check-out",
|
||
"AMOUNT": "Amount",
|
||
"UPDATED_AT": "Updated at"
|
||
},
|
||
"API": {
|
||
"PIX_EXPIRED": "Pix for this reservation is expired.",
|
||
"PIX_NOT_GENERATED": "Pix has not been generated yet.",
|
||
"PIX_COPIED": "Pix copied successfully.",
|
||
"PIX_COPY_FAILED": "Unable to copy Pix."
|
||
}
|
||
},
|
||
"CAPTAIN_ORCHESTRATOR_EDITOR": {
|
||
"MISSING_DELIMITER_PREFIX": "This prompt was saved before the sections split. All content appears in the \"System Base Prompt\" field. Click",
|
||
"MISSING_DELIMITER_BUTTON": "Restore Default",
|
||
"MISSING_DELIMITER_SUFFIX": "to get automatic splitting, or manually move assistant content to the correct field."
|
||
},
|
||
"CAPTAIN_ROLETA": {
|
||
"HEADER": "Roulette — Redeem",
|
||
"TAB_REDEEM": "Redeem",
|
||
"TAB_REPORT": "Report",
|
||
"REDEEM": {
|
||
"TITLE": "Deliver prize to guest",
|
||
"DESC": "Type the code the guest showed on WhatsApp and confirm the redemption. Jasmine automatically sends a confirmation to the guest.",
|
||
"CODE_LABEL": "Coupon code",
|
||
"CODE_PLACEHOLDER": "Ex: ABC123",
|
||
"NOTES_LABEL": "Note (optional)",
|
||
"NOTES_PLACEHOLDER": "Any detail about the redemption",
|
||
"SUBMIT": "Confirm redemption",
|
||
"SUBMITTING": "Registering...",
|
||
"SUCCESS_PREFIX": "{prize} delivered to ",
|
||
"SUCCESS_FULL": "✅ {prize} delivered to {name}.",
|
||
"ERROR_FULL": "⚠️ {message}",
|
||
"FALLBACK_CLIENT": "guest",
|
||
"ERROR_EMPTY_CODE": "Type the code printed on the guest's coupon.",
|
||
"ERROR_NOT_FOUND": "Code not found. Check the spelling.",
|
||
"ERROR_ALREADY_REDEEMED": "This coupon has already been redeemed.",
|
||
"ERROR_NO_PRIZE": "This coupon landed on \"No luck\" — nothing to deliver.",
|
||
"ERROR_NO_RECEPTIONIST": "Log in again and try once more.",
|
||
"ERROR_RPC_FAILED": "Error calling the reservations server.",
|
||
"ERROR_EXCEPTION": "Something broke. Tell the tech team.",
|
||
"ERROR_DEFAULT": "Not registered."
|
||
},
|
||
"HISTORY": {
|
||
"TITLE": "Active coupons (last 7 days)",
|
||
"LOADING": "Loading...",
|
||
"EMPTY": "No active coupons in recent days.",
|
||
"LOAD_ERROR": "Error loading pending coupons",
|
||
"COL_CODE": "Code",
|
||
"COL_PRIZE": "Prize",
|
||
"COL_CLIENT": "Guest",
|
||
"COL_GENERATED": "Generated",
|
||
"COL_STATUS": "Redemption",
|
||
"STATUS_REDEEMED_PREFIX": "✅ ",
|
||
"STATUS_PENDING": "⏳ Pending"
|
||
},
|
||
"REPORT": {
|
||
"TITLE": "Redemptions by receptionist",
|
||
"DESC": "Anti-fraud: flags those redeeming well above team average.",
|
||
"PERIOD_7": "Last 7 days",
|
||
"PERIOD_14": "Last 14 days",
|
||
"PERIOD_30": "Last 30 days",
|
||
"LOADING": "Loading report...",
|
||
"EMPTY": "No redemptions in this period.",
|
||
"LOAD_ERROR": "Error loading report",
|
||
"KPI_TOTAL": "Total redemptions",
|
||
"KPI_AVG": "Average per person",
|
||
"KPI_COUNT": "Active receptionists",
|
||
"KPI_THRESHOLD": "Alert threshold",
|
||
"KPI_THRESHOLD_PREFIX": "≥ ",
|
||
"COL_RECEPTIONIST": "Receptionist",
|
||
"COL_TOTAL": "Total",
|
||
"COL_BRINDES": "Gifts",
|
||
"COL_DESCONTOS": "Discounts",
|
||
"COL_SUM_DISCOUNT": "Σ % discount",
|
||
"COL_STATUS": "Status",
|
||
"STATUS_ANOMALY": "⚠️ Above average",
|
||
"STATUS_NORMAL": "Normal",
|
||
"FOOTER_HINT": "Alert triggers when a receptionist has ≥ {threshold} redemptions (minimum 5, or 2.5× team average). Verify guest conversations on WhatsApp to confirm."
|
||
}
|
||
},
|
||
"CAPTAIN_FUNNEL": {
|
||
"HEADER": "Conversion Funnel",
|
||
"DESC": "Track the customer journey from price inquiry to paid Pix. Identifies where customers drop off.",
|
||
"PERIOD_7": "7 days",
|
||
"PERIOD_30": "30 days",
|
||
"PERIOD_60": "60 days",
|
||
"PERIOD_90": "90 days",
|
||
"LOADING": "Loading funnel...",
|
||
"EMPTY": "No Captain conversations in this period. Try a different range.",
|
||
"LOAD_ERROR": "Error loading funnel",
|
||
"INSIGHT_LABEL": "Biggest drop-off point",
|
||
"INSIGHT_FULL": "{lost} customers dropped between \"{from}\" and \"{to}\" — that's {pct} of those who reached the previous stage.",
|
||
"FUNNEL_TITLE": "Overall funnel ({count} conversations analyzed)",
|
||
"BY_SUITE_TITLE": "By suite category",
|
||
"BY_SUITE_HEADER": "Suite",
|
||
"BY_SUITE_FOOTER": "Category detected by mention in conversation content. Conversations without specific mention are not shown in this breakdown.",
|
||
"STAGES": {
|
||
"price_inquiry": "Asked price",
|
||
"price_answered": "Received quote",
|
||
"reservation_drafted": "Reservation started",
|
||
"pix_generated": "Pix generated",
|
||
"pix_paid": "Pix paid"
|
||
}
|
||
},
|
||
"CAPTAIN_SETTINGS": {
|
||
"TITLE": "Captain Settings",
|
||
"UNITS": {
|
||
"TITLE": "Pix Units",
|
||
"DESC": "Manage the settings of different Pix units integrated with Banco Inter.",
|
||
"ADD_UNIT": "Add Unit",
|
||
"EDIT_UNIT": "Edit Unit",
|
||
"DELETE_UNIT": "Delete Unit",
|
||
"LIST": {
|
||
"TABLE_HEADER": [
|
||
"Pix Key",
|
||
"Account",
|
||
"Certificates",
|
||
"Monitoring",
|
||
"Actions"
|
||
],
|
||
"CERT": "Cert",
|
||
"KEY": "Key",
|
||
"PROACTIVE_ON": "Auto-check on",
|
||
"PROACTIVE_OFF": "Auto-check off",
|
||
"SEPARATOR": "|",
|
||
"ADD_NEW_UNIT": "Add a Pix Unit",
|
||
"NO_UNITS_MESSAGE": "There are no pix units entered yet. Create one now to start receiving by Banco Inter pix."
|
||
},
|
||
"DELETE": {
|
||
"BUTTON_TEXT": "Delete",
|
||
"TITLE": "Delete Pix Unit",
|
||
"DESC": "Are you sure you want to delete this pix unit? This action cannot be undone.",
|
||
"CONFIRM": {
|
||
"TITLE": "Confirm Deletion",
|
||
"MESSAGE": "Are you sure you want to delete the Unit?",
|
||
"YES": "Delete",
|
||
"NO": "Cancel"
|
||
},
|
||
"API": {
|
||
"SUCCESS_MESSAGE": "Unit deleted successfully.",
|
||
"ERROR_MESSAGE": "There was an error trying to delete the unit."
|
||
}
|
||
},
|
||
"ADD": {
|
||
"TITLE": "New Pix Unit",
|
||
"DESC": "Add your Banco Inter app credentials",
|
||
"CANCEL_BUTTON_TEXT": "Cancel",
|
||
"SUBMIT_BUTTON_TEXT": "Create unit",
|
||
"API": {
|
||
"SUCCESS_MESSAGE": "Unit created successfully!",
|
||
"ERROR_MESSAGE": "There was an error trying to create the unit."
|
||
}
|
||
},
|
||
"EDIT": {
|
||
"TITLE": "Edit Pix Unit",
|
||
"DESC": "Update Banco Inter credentials",
|
||
"CANCEL_BUTTON_TEXT": "Cancel",
|
||
"SUBMIT_BUTTON_TEXT": "Save unit",
|
||
"API": {
|
||
"SUCCESS_MESSAGE": "Unit updated successfully!",
|
||
"ERROR_MESSAGE": "There was an error trying to update."
|
||
}
|
||
},
|
||
"FORM": {
|
||
"NAME": {
|
||
"LABEL": "Unit Name",
|
||
"PLACEHOLDER": "Ex: Headquaters",
|
||
"ERROR": "Name is required"
|
||
},
|
||
"INTER_PIX_KEY": {
|
||
"LABEL": "Pix Key (from Inter app)",
|
||
"PLACEHOLDER": "Ex: 12.345.678/0001-90",
|
||
"ERROR": "Pix key is required",
|
||
"HELP_TEXT": "Your Pix key that will receive the charges"
|
||
},
|
||
"INTER_ACCOUNT_NUMBER": {
|
||
"LABEL": "Inter account number",
|
||
"PLACEHOLDER": "Ex: 1234567-8",
|
||
"ERROR": "Account number is required"
|
||
},
|
||
"INTER_CLIENT_ID": {
|
||
"LABEL": "Inter App Client ID",
|
||
"PLACEHOLDER": ""
|
||
},
|
||
"INTER_CLIENT_SECRET": {
|
||
"LABEL": "Inter App Client Secret",
|
||
"PLACEHOLDER": ""
|
||
},
|
||
"INTER_CERT_CONTENT": {
|
||
"LABEL": "Certificate Content (.crt)",
|
||
"PLACEHOLDER": "Paste the text contained in the .crt file here...",
|
||
"UPLOAD_BUTTON": "Import .crt file"
|
||
},
|
||
"INTER_KEY_CONTENT": {
|
||
"LABEL": "Key Content (.key)",
|
||
"PLACEHOLDER": "Paste the text contained in the .key file here...",
|
||
"UPLOAD_BUTTON": "Import .key file"
|
||
},
|
||
"PROACTIVE_PIX_POLLING": {
|
||
"LABEL": "Proactive payment confirmation (Banco Inter)",
|
||
"CHECKBOX_LABEL": "Check payment automatically every 10 minutes for up to 1 hour",
|
||
"HELP_TEXT": "When enabled, the system proactively queries Inter to confirm pending Pix payments.",
|
||
"DISABLED_HELP_TEXT": "Complete Banco Inter credentials (Client ID/Secret, account, Pix key, certificate and key) to enable."
|
||
},
|
||
"CERT_PRESENT_HELP": "Certificate already configured.",
|
||
"CANCEL": "Cancel",
|
||
"SAVE": "Save"
|
||
},
|
||
"INBOX": {
|
||
"LABEL": "Pix Unit",
|
||
"PLACEHOLDER": "Select a unit",
|
||
"NO_UNIT": "No unit linked",
|
||
"CONNECT_UNIT_LABEL": "Link Pix Unit",
|
||
"CONNECT_UNIT_PLACEHOLDER": "Choose the Inter unit for this inbox",
|
||
"CONNECT_UNIT_HELP": "Select which Pix Unit should be used by this inbox."
|
||
},
|
||
"TEST": {
|
||
"HEADER_TITLE": "Header validation",
|
||
"HEADER_DESCRIPTION": "Visual test to validate page rendering.",
|
||
"BODY_TEXT": "If this screen appears, the issue is likely in the table or Vuex, not in the base layout."
|
||
}
|
||
},
|
||
"GALLERY": {
|
||
"TITLE": "Gallery",
|
||
"DESC": "Manage suite photos that subagents can send to customers.",
|
||
"ADD_ITEM": "Add Photo",
|
||
"EDIT_ITEM": "Edit",
|
||
"DELETE_ITEM": "Delete",
|
||
"LIST": {
|
||
"TABLE_HEADER": [
|
||
"Image",
|
||
"Inbox and description",
|
||
"Category",
|
||
"Suite",
|
||
"Actions"
|
||
],
|
||
"ADD_NEW_ITEM": "Add gallery photos",
|
||
"NO_ITEMS_MESSAGE": "There are no photos available yet for automatic customer sending."
|
||
},
|
||
"DELETE": {
|
||
"CONFIRM": {
|
||
"TITLE": "Delete photo",
|
||
"MESSAGE": "Are you sure you want to delete this photo from the gallery?",
|
||
"YES": "Delete"
|
||
},
|
||
"API": {
|
||
"SUCCESS_MESSAGE": "Photo deleted successfully.",
|
||
"ERROR_MESSAGE": "Unable to delete the photo."
|
||
}
|
||
},
|
||
"ADD": {
|
||
"TITLE": "New gallery photo",
|
||
"DESC": "Upload a suite photo and metadata for agent search.",
|
||
"SUBMIT_BUTTON_TEXT": "Save photo",
|
||
"API": {
|
||
"SUCCESS_MESSAGE": "Photo created successfully!",
|
||
"ERROR_MESSAGE": "Unable to create the photo."
|
||
}
|
||
},
|
||
"EDIT": {
|
||
"TITLE": "Edit gallery photo",
|
||
"DESC": "Update gallery metadata and image.",
|
||
"SUBMIT_BUTTON_TEXT": "Save changes",
|
||
"API": {
|
||
"SUCCESS_MESSAGE": "Photo updated successfully!",
|
||
"ERROR_MESSAGE": "Unable to update the photo."
|
||
}
|
||
},
|
||
"FORM": {
|
||
"INBOX": {
|
||
"LABEL": "Inbox",
|
||
"GLOBAL_OPTION": "Global (all inboxes)",
|
||
"HELP": "Select which inbox can use these photos.",
|
||
"GLOBAL_HELP": "These photos can be used by agents in any inbox.",
|
||
"SPECIFIC_HELP": "These photos will be used only in inbox {inbox}."
|
||
},
|
||
"SUITE_CATEGORY": {
|
||
"LABEL": "Suite category",
|
||
"PLACEHOLDER": "Ex: Hydromassage",
|
||
"ERROR": "Suite category is required"
|
||
},
|
||
"SUITE_NUMBER": {
|
||
"LABEL": "Suite number/identifier",
|
||
"PLACEHOLDER": "Ex: 101",
|
||
"ERROR": "Suite identifier is required"
|
||
},
|
||
"DESCRIPTION": {
|
||
"LABEL": "Photo description",
|
||
"PLACEHOLDER": "Describe what appears in this photo",
|
||
"ERROR": "Description is required"
|
||
},
|
||
"IMAGE": {
|
||
"LABEL": "Image",
|
||
"HELP_TEXT": "Use clear photos. Recommended formats: PNG/JPG.",
|
||
"ERROR": "Image is required",
|
||
"PREVIEW_ALT": "Photo preview"
|
||
},
|
||
"ACTIVE": {
|
||
"LABEL": "Available for agent sending"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"CAPTAIN": {
|
||
"BANNER": {
|
||
"RESPONSES": "You have used more than 80% of your responses limit. To continue using Captain AI, please upgrade.",
|
||
"DOCUMENTS": "Documents limit reached. Please upgrade to continue using Captain AI."
|
||
},
|
||
"FORM": {
|
||
"CANCEL": "Cancel",
|
||
"CREATE": "Create",
|
||
"EDIT": "Update"
|
||
},
|
||
"RESPONSES": {
|
||
"HEADER": "FAQs",
|
||
"PENDING_FAQS": "Pending FAQs",
|
||
"ADD_NEW": "Create new FAQ",
|
||
"DOCUMENTABLE": {
|
||
"CONVERSATION": "Conversation #{id}"
|
||
},
|
||
"SELECTED": "{count} selected",
|
||
"SELECT_ALL": "Select all ({count})",
|
||
"UNSELECT_ALL": "Unselect all ({count})",
|
||
"SEARCH_PLACEHOLDER": "Search FAQs...",
|
||
"BULK_APPROVE_BUTTON": "Approve",
|
||
"BULK_DELETE_BUTTON": "Delete",
|
||
"BULK_APPROVE": {
|
||
"SUCCESS_MESSAGE": "FAQs approved successfully",
|
||
"ERROR_MESSAGE": "An error occurred while approving FAQs. Try again."
|
||
},
|
||
"BULK_DELETE": {
|
||
"TITLE": "Delete FAQs?",
|
||
"DESCRIPTION": "Are you sure you want to delete selected FAQs? This action cannot be undone.",
|
||
"CONFIRM": "Yes, delete all",
|
||
"SUCCESS_MESSAGE": "FAQs deleted successfully",
|
||
"ERROR_MESSAGE": "An error occurred while deleting FAQs, please try again."
|
||
},
|
||
"DELETE": {
|
||
"TITLE": "Are you sure you want to delete this FAQ?",
|
||
"DESCRIPTION": "",
|
||
"CONFIRM": "Yes, delete",
|
||
"SUCCESS_MESSAGE": "FAQ deleted successfully",
|
||
"ERROR_MESSAGE": "An error occurred while deleting FAQ, please try again."
|
||
}
|
||
}
|
||
},
|
||
"CAPTAIN_REPORTS": {
|
||
"TITLE": "AI Reports",
|
||
"DESC": "Weekly AI-generated insights based on each unit's conversations.",
|
||
"LOADING": "Loading reports...",
|
||
"ALL_UNITS": "All units",
|
||
"ALL_INBOXES": "All inboxes",
|
||
"UNITS_GROUP": "Pix Units",
|
||
"INBOXES_GROUP": "Inboxes",
|
||
"TABS": {
|
||
"DASHBOARD": "Dashboard",
|
||
"INSIGHTS": "AI Insights",
|
||
"OPERATIONAL": "Operational",
|
||
"EXECUTIVE": "Executive",
|
||
"LANDING_PAGES": "Landing Pages",
|
||
"RETENTION": "Retention"
|
||
},
|
||
"RETENTION": {
|
||
"PERIOD_LABEL": "Period",
|
||
"PERIOD_THIS_MONTH": "This month",
|
||
"PERIOD_LAST_30": "Last 30 days",
|
||
"PERIOD_LAST_90": "Last 90 days",
|
||
"PERIOD_CUSTOM": "Custom",
|
||
"APPLY": "Apply",
|
||
"NO_DATA": "No data.",
|
||
"KPI": {
|
||
"ACTIVE": "Active customers",
|
||
"ACTIVE_HINT": "last interaction within 30 days",
|
||
"RECURRING": "Recurring",
|
||
"RECURRING_HINT": "≥2 qualified interactions in 90 days",
|
||
"RETURN_30D": "30-day return rate",
|
||
"RETURN_30D_HINT": "returned to interact within 7 days",
|
||
"PIX_CONVERSION": "Pix conversion",
|
||
"PIX_CONVERSION_HINT": "{paid} paid out of {generated} generated"
|
||
},
|
||
"FLOW": {
|
||
"TITLE": "Period flow",
|
||
"NEW_IN_PERIOD": "new in period",
|
||
"RETURNED_IN_PERIOD": "returned in period",
|
||
"TOTAL_TOUCHES": "total interactions",
|
||
"BASE_STATUS": "Current base status",
|
||
"SLEEPING": "{count} sleeping",
|
||
"SLEEPING_HINT": "30-90d without contact",
|
||
"AT_RISK": "{count} at risk",
|
||
"AT_RISK_HINT": "90-180d without contact",
|
||
"CHURNED": "{count} inactive",
|
||
"CHURNED_HINT": "180d+ without contact"
|
||
},
|
||
"COHORT": {
|
||
"TITLE": "Cohort matrix",
|
||
"SUBTITLE": "% of each cohort's customers who returned to interact in M+N months.",
|
||
"EXPORT_CSV": "Export CSV",
|
||
"EMPTY": "No cohort data yet.",
|
||
"COL_COHORT": "Cohort",
|
||
"COL_SIZE": "Size",
|
||
"CELL_TITLE": "{count} active contacts ({rate}%)"
|
||
},
|
||
"BADGE": {
|
||
"STATUS_FIRST": "First contact",
|
||
"STATUS_INACTIVE": "Inactive",
|
||
"STATUS_AT_RISK": "At risk",
|
||
"STATUS_SLEEPING": "Sleeping",
|
||
"STATUS_RECURRING": "Recurring",
|
||
"STATUS_ACTIVE": "Active",
|
||
"LAST_INTERACTION": "last {days}",
|
||
"INTERACTIONS_LABEL": "interaction | interactions",
|
||
"INTERACTIONS_TITLE": "Qualified interactions (≥2+2 messages)",
|
||
"ONE_SHOT_LABEL": "one-shot",
|
||
"ONE_SHOT_TITLE": "One-shot consultations (≥1+1)",
|
||
"PIX_LABEL": "Pix paid",
|
||
"PIX_TITLE": "Pix generated / reservations paid",
|
||
"DAYS_TODAY": "today",
|
||
"DAYS_YESTERDAY": "yesterday",
|
||
"DAYS_RECENT": "{days} days ago",
|
||
"DAYS_ONE_MONTH": "about 1 month ago",
|
||
"DAYS_MONTHS": "{months} months ago",
|
||
"DAYS_YEARS": "{years} years ago"
|
||
},
|
||
"ERRORS": {
|
||
"SUMMARY": "Failed to load retention KPIs",
|
||
"COHORT": "Failed to load cohort"
|
||
}
|
||
},
|
||
"EXECUTIVE": {
|
||
"LOADING": "Loading executive digest...",
|
||
"NO_DATA": "No insights for the period. Run the weekly analysis to see data here.",
|
||
"TITLE": "Executive Digest",
|
||
"SUBTITLE": "Same report sent to Mattermost, with drill-down and filters.",
|
||
"DELIVER_BUTTON": "Send to Mattermost now",
|
||
"DELIVER_SUCCESS": "Digest queued. It will arrive in Mattermost shortly.",
|
||
"DELIVER_ERROR": "Failed to dispatch the digest. Check Rails log.",
|
||
"CONVERSATIONS": "Conversations",
|
||
"MESSAGES": "Messages",
|
||
"UNITS_ANALYZED": "Units analyzed",
|
||
"INSIGHTS_COUNT": "Insights generated",
|
||
"UNIT_TABLE": "Comparative by unit",
|
||
"COL_UNIT": "Unit",
|
||
"COL_CONVS": "Conversations",
|
||
"COL_DELTA": "vs previous week",
|
||
"COL_AI_RATE": "AI success rate",
|
||
"COL_FAILURES": "Failures",
|
||
"AI_FAILURES": "Where Angelina failed (click to see conversations)",
|
||
"OPPORTUNITIES": "Opportunities — what customers asked for",
|
||
"OPPORTUNITIES_HINT": "Click an opportunity to see real conversations where it was mentioned.",
|
||
"COMPLAINTS": "Recurring complaints",
|
||
"PRAISES": "Recurring praises",
|
||
"RECOMMENDATIONS": "AI Recommendations",
|
||
"DRILLDOWN_TITLE": "Related conversations",
|
||
"NO_CONVERSATIONS_FOUND": "No conversations found with those keywords in the period.",
|
||
"NO_CONVERSATIONS_HINT": "The insight description is an AI abstraction. If no keyword matches the literal conversation text, nothing is returned. Try clicking a more specific item.",
|
||
"SEARCH_TOKENS": "Keywords searched",
|
||
"OPEN_CONVERSATION": "Open in Chatwoot"
|
||
},
|
||
"LP": {
|
||
"LOADING": "Loading data...",
|
||
"NO_DATA": "No clicks recorded yet. Integrate the pixel on your landing page to see data here.",
|
||
"TOTAL_CLICKS": "Total Clicks",
|
||
"TOTAL_CONVERSIONS": "Conversions (WhatsApp)",
|
||
"CONVERSION_RATE": "Conversion Rate",
|
||
"TOTAL_DROPOFF": "Drop-off (No conversation)",
|
||
"DROPOFF_RATE": "Drop-off Rate",
|
||
"UNIQUE_CONTACTS": "Unique contacts converted",
|
||
"FUNNEL_TITLE": "Landing page funnel",
|
||
"DAILY_TREND": "Daily click vs conversion trend",
|
||
"BY_SOURCE": "Clicks by Source",
|
||
"BY_CAMPAIGN": "Clicks by Campaign",
|
||
"BY_HOSTNAME": "Clicks by Landing Page",
|
||
"CLICKS": "clicks",
|
||
"CONV": "conv",
|
||
"REFRESH": "Refresh",
|
||
"LEGEND_CLICKS": "Clicks",
|
||
"LEGEND_CONVERSIONS": "Conversions"
|
||
},
|
||
"FILTER_DATE": {
|
||
"LABEL": "Period:",
|
||
"START": "Start Date",
|
||
"END": "End Date",
|
||
"TODAY": "Today",
|
||
"YESTERDAY": "Yesterday",
|
||
"LAST_7_DAYS": "Last 7 days",
|
||
"LAST_30_DAYS": "Last 30 days",
|
||
"THIS_WEEK": "This week",
|
||
"LAST_WEEK": "Last Week",
|
||
"CURRENT_MONTH": "Current Month",
|
||
"LAST_MONTH": "Last Month",
|
||
"CUSTOM": "Custom",
|
||
"SEPARATOR": "-"
|
||
},
|
||
"INSIGHT": {
|
||
"CONVERSATIONS": "conversations",
|
||
"MESSAGES": "messages",
|
||
"TOP_TOPICS": "Top Topics",
|
||
"AI_FAILURES": "AI Failures",
|
||
"BULLET": "•",
|
||
"COUNT_PREFIX": "(",
|
||
"COUNT_SUFFIX": ")",
|
||
"TIMES": "x",
|
||
"SENTIMENT": "Sentiment",
|
||
"SENTIMENT_POSITIVE": "Positive",
|
||
"SENTIMENT_NEGATIVE": "Negative",
|
||
"SENTIMENT_NEUTRAL": "Neutral",
|
||
"PRAISES": "Customer Praises",
|
||
"COMPLAINTS": "Complaints",
|
||
"FAQ_GAPS": "FAQ Gaps",
|
||
"FAQ_GAPS_HINT": "Questions customers ask that the agent doesn't cover",
|
||
"MOST_REQUESTED_SUITES": "Most Requested Suites",
|
||
"PRICE_REACTIONS": "Price Reactions",
|
||
"PRICE_OBJECTIONS": "price objections",
|
||
"RECOMMENDATIONS": "Recommendations",
|
||
"SHOW_DETAILS": "View full analysis",
|
||
"HIDE_DETAILS": "Hide details"
|
||
},
|
||
"EMPTY": {
|
||
"TITLE": "No reports generated",
|
||
"MESSAGE": "Generate a new report to analyze support performance."
|
||
},
|
||
"GENERATE": {
|
||
"BUTTON": "Generate Analysis",
|
||
"SUCCESS": "Report requested successfully! It may take a few minutes.",
|
||
"ERROR": "Error requesting report generation.",
|
||
"DATE_REQUIRED": "Please select start and end dates."
|
||
},
|
||
"STATUS": {
|
||
"PENDING": "Pending",
|
||
"PROCESSING": "Processing",
|
||
"DONE": "Completed",
|
||
"FAILED": "Failed"
|
||
},
|
||
"OPERATIONAL": {
|
||
"LOADING": "Loading operational data...",
|
||
"NO_DATA": "No operational data for the selected period.",
|
||
"CONVERSATIONS_SECTION": "Conversations",
|
||
"RESERVATIONS_SECTION": "Reservations",
|
||
"TOTAL": "Total",
|
||
"RESOLVED": "Resolved",
|
||
"OPEN": "Open",
|
||
"AVG_RESOLUTION": "Avg resolution time",
|
||
"RES_TOTAL": "Total reservations",
|
||
"RES_PAID": "Paid",
|
||
"RES_EXPIRED": "Expired",
|
||
"RES_REVENUE": "Paid revenue",
|
||
"BY_INBOX": "Volume by inbox",
|
||
"RESOLUTION_RATE_TOOLTIP": "Resolution rate",
|
||
"DAILY_DIST": "Daily distribution",
|
||
"HOURLY_DIST": "Hourly distribution",
|
||
"PEAK": "Peak"
|
||
},
|
||
"DASHBOARD": {
|
||
"TOTAL_CONVERSATIONS": "Analyzed conversations",
|
||
"AVG_SENTIMENT": "Avg. positive sentiment",
|
||
"FAQ_GAPS_TOTAL": "FAQ gaps identified",
|
||
"WEEKS_ANALYZED": "weeks analyzed",
|
||
"NO_DATA": "Not enough data. Generate more AI reports to see the dashboard.",
|
||
"SENTIMENT_TREND": "Sentiment trend by week",
|
||
"FAILURES_RANKING": "Agent failure ranking",
|
||
"FAILURES_RANKING_HINT": "Most frequent situations where the AI couldn't respond well",
|
||
"FAQ_PRIORITY": "Priority FAQs to create",
|
||
"FAQ_PRIORITY_HINT": "Questions customers ask most that aren't in the FAQ yet",
|
||
"CUSTOMER_BEHAVIOR": "Customer behavior",
|
||
"TOP_TOPICS_TITLE": "Most discussed topics",
|
||
"SUITES_TITLE": "Most requested suites",
|
||
"COMPLAINTS_TREND": "Complaints volume by week",
|
||
"HANDOFFS_TITLE": "Estimated handoffs to human",
|
||
"HANDOFFS_HINT": "Based on AI failure frequency. Direct handoff tracking coming soon.",
|
||
"TREND_UP": "rising",
|
||
"TREND_DOWN": "falling",
|
||
"TREND_STABLE": "stable",
|
||
"WEEKS": "weeks"
|
||
},
|
||
"FAQ_QUICK_ADD": {
|
||
"BUTTON": "Create FAQ",
|
||
"TITLE": "Create FAQ from AI suggestion",
|
||
"QUESTION_LABEL": "Question (suggested by AI)",
|
||
"ANSWER_LABEL": "Answer",
|
||
"ANSWER_PLACEHOLDER": "Write the answer to this question...",
|
||
"ASSISTANT_LABEL": "AI Agent",
|
||
"ASSISTANT_PLACEHOLDER": "Select the agent",
|
||
"CANCEL": "Cancel",
|
||
"SAVE": "Save FAQ",
|
||
"SUCCESS": "FAQ created successfully!",
|
||
"ERROR": "Error creating FAQ. Please try again."
|
||
}
|
||
},
|
||
"CAPTAIN_LIFECYCLE": {
|
||
"HEADER": "Customer Journey",
|
||
"SUBTITLE": "Automated WhatsApp messages along the reservation lifecycle",
|
||
"TABS": {
|
||
"RULES": "Rules",
|
||
"SETTINGS": "Settings",
|
||
"HISTORY": "History"
|
||
},
|
||
"RULES": {
|
||
"EMPTY": "No rules configured yet.",
|
||
"CREATE": "New rule",
|
||
"TEMPLATES_TITLE": "Ready-made templates",
|
||
"COLUMNS": {
|
||
"NAME": "Name",
|
||
"EVENT": "Event",
|
||
"OFFSET": "Offset",
|
||
"FILTER": "Filter",
|
||
"STATUS": "Status",
|
||
"ACTIONS": "Actions"
|
||
},
|
||
"STATUS": {
|
||
"ENABLED": "Active",
|
||
"DISABLED": "Disabled"
|
||
},
|
||
"ACTIONS": {
|
||
"EDIT": "Edit",
|
||
"DUPLICATE": "Duplicate",
|
||
"TOGGLE": "Enable/Disable",
|
||
"DELETE": "Delete"
|
||
},
|
||
"DELETE_CONFIRM": "Are you sure you want to delete this rule?",
|
||
"TOAST": {
|
||
"CREATED": "Rule created successfully.",
|
||
"UPDATED": "Rule updated.",
|
||
"DELETED": "Rule deleted."
|
||
},
|
||
"WIZARD": {
|
||
"TITLE_CREATE": "New rule",
|
||
"TITLE_EDIT": "Edit rule",
|
||
"STEP_WHEN": "When?",
|
||
"STEP_WHO": "Who?",
|
||
"STEP_WHAT": "What?",
|
||
"STEP_REVIEW": "Review",
|
||
"NEXT": "Next",
|
||
"BACK": "Back",
|
||
"SAVE": "Save",
|
||
"CANCEL": "Cancel",
|
||
"OFFSET_UNIT_LABEL": "min",
|
||
"STEP_LABELS": {
|
||
"WHEN": "1. When?",
|
||
"WHO": "2. Who?",
|
||
"WHAT": "3. What?",
|
||
"REVIEW_TAB": "4. Review"
|
||
},
|
||
"REVIEW": {
|
||
"NAME": "Name:",
|
||
"EVENT": "Event:",
|
||
"OFFSET": "Offset (min):",
|
||
"UNITS": "Units:",
|
||
"MESSAGE": "Message:"
|
||
},
|
||
"FIELDS": {
|
||
"NAME": "Rule name",
|
||
"DESCRIPTION": "Description",
|
||
"EVENT": "Trigger event",
|
||
"OFFSET_VALUE": "Value",
|
||
"OFFSET_UNIT": "Unit",
|
||
"OFFSET_DIRECTION": "Direction",
|
||
"UNITS": "Units",
|
||
"CATEGORIAS": "Suite categories",
|
||
"PERMANENCIAS": "Stay types",
|
||
"MESSAGE_TYPE": "Message type",
|
||
"MESSAGE_BODY": "Message body",
|
||
"PRIORITY": "Priority",
|
||
"ENABLED": "Rule active"
|
||
},
|
||
"OFFSET_UNITS": {
|
||
"MINUTES": "Minutes",
|
||
"HOURS": "Hours",
|
||
"DAYS": "Days"
|
||
},
|
||
"OFFSET_DIRECTIONS": {
|
||
"BEFORE": "Before",
|
||
"AFTER": "After"
|
||
},
|
||
"EVENTS": {
|
||
"RESERVATION_CONFIRMED": "Reservation confirmed (Pix paid)",
|
||
"CHECKIN_SCHEDULED_AT": "Check-in time",
|
||
"CHECKOUT_SCHEDULED_AT": "Check-out time",
|
||
"RESERVATION_CANCELLED": "Reservation cancelled",
|
||
"RESERVATION_NO_SHOW": "No-show"
|
||
},
|
||
"MESSAGE_TYPES": {
|
||
"TEXT": "Plain text",
|
||
"BUTTONS": "Text with buttons",
|
||
"LIST": "List menu",
|
||
"URL_BUTTON": "Link button"
|
||
}
|
||
}
|
||
},
|
||
"SETTINGS": {
|
||
"GUARDS_TITLE": "Anti-spam guards",
|
||
"QUIET_HOURS_ENABLED": "Enable quiet hours",
|
||
"QUIET_HOURS_FROM": "From",
|
||
"QUIET_HOURS_TO": "To",
|
||
"MIN_INTERVAL": "Minimum interval between messages (min)",
|
||
"MIN_INTERVAL_HELP": "0 disables",
|
||
"PAUSE_ON_REPLY": "Pause if customer replied",
|
||
"PAUSE_ON_REPLY_WINDOW": "Window (min)",
|
||
"OPT_OUT_LABEL": "Opt-out label",
|
||
"MAX_PER_RESERVATION_INFO": "Maximum of 5 messages per reservation (not configurable)",
|
||
"CONCIERGE_TITLE": "Concierge (Sofia) per Unit",
|
||
"CONCIERGE_INBOX": "WhatsApp Inbox",
|
||
"CONCIERGE_PERSONA": "Persona name",
|
||
"CONCIERGE_KNOWLEDGE": "Knowledge base (markdown)",
|
||
"CONCIERGE_VARIABLES": "Unit variables",
|
||
"CONCIERGE_VARIABLE_KEY": "Key",
|
||
"CONCIERGE_VARIABLE_VALUE": "Value",
|
||
"CONCIERGE_ADD_VARIABLE": "Add variable",
|
||
"CONCIERGE_CONFIGURED": "Configured",
|
||
"CONCIERGE_NOT_CONFIGURED": "Not configured",
|
||
"SAVE": "Save changes",
|
||
"TOAST": {
|
||
"SAVED": "Settings saved.",
|
||
"CONCIERGE_SAVED": "Unit concierge updated."
|
||
}
|
||
},
|
||
"HISTORY": {
|
||
"EMPTY": "No deliveries recorded.",
|
||
"COLUMNS": {
|
||
"RULE": "Rule",
|
||
"CUSTOMER": "Customer",
|
||
"RESERVATION": "Reservation",
|
||
"STATUS": "Status",
|
||
"FIRE_AT": "Fired at",
|
||
"REASON": "Reason",
|
||
"ACTIONS": ""
|
||
},
|
||
"STATUS": {
|
||
"SCHEDULED": "Scheduled",
|
||
"SENT": "Sent",
|
||
"SKIPPED": "Skipped",
|
||
"FAILED": "Failed",
|
||
"CANCELLED": "Cancelled"
|
||
},
|
||
"FILTERS": {
|
||
"STATUS": "Status",
|
||
"RULE": "Rule",
|
||
"FROM": "From",
|
||
"TO": "To",
|
||
"ALL": "All"
|
||
},
|
||
"PREVIEW": "Preview",
|
||
"TOTAL": "total",
|
||
"PAGINATION": {
|
||
"PREV": "Prev",
|
||
"NEXT": "Next"
|
||
},
|
||
"MODAL": {
|
||
"TITLE": "Message preview",
|
||
"CLOSE": "Close",
|
||
"RULE": "Rule",
|
||
"STATUS": "Status",
|
||
"REASON": "Reason",
|
||
"ERROR": "Error",
|
||
"FIRE_AT": "Fire at",
|
||
"SENT_AT": "Sent at",
|
||
"RENDERED": "Rendered",
|
||
"RESERVATION_ID": "Reservation #"
|
||
}
|
||
}
|
||
},
|
||
"CAPTAIN_HERMES_BUILDER": {
|
||
"TITLE": "Agent Builder",
|
||
"DESCRIPTION": "Create new Hermes agents through a guided chat with the Builder.",
|
||
"HEADER_TITLE": "Agent Builder",
|
||
"HEADER_DESCRIPTION": "Chat with the Builder to create a new Hermes agent. It asks questions and saves the spec as JSON for review at the end.",
|
||
"RESET": "Clear conversation",
|
||
"RESET_CONFIRM": "Clear current conversation with the Builder?",
|
||
"EMPTY_STATE": "Ready to create a new Hermes agent? Click \"Start creation\" and the Builder will guide you.",
|
||
"PLACEHOLDER": "Type and press Enter to send (Shift+Enter for new line)",
|
||
"SEND": "Send",
|
||
"SESSION_LABEL": "Session:",
|
||
"SEND_FAILED": "Send failed: {message}",
|
||
"RESET_FAILED": "Failed to clear session.",
|
||
"START": "Start creation",
|
||
"TAB_CHAT": "Chat (Builder)",
|
||
"TAB_VERIFY": "Verification",
|
||
"VERIFY": {
|
||
"TITLE": "Agent verification",
|
||
"DESCRIPTION": "Runs health checks (database, routing, pricing, MCP) for a Hermes agent. For each failure with a Repair button, the UI attempts an automatic fix. Other failures need hermes-provision on the VPS.",
|
||
"NO_ASSISTANTS": "No Hermes agents registered",
|
||
"RUN": "Run check",
|
||
"RUNNING": "Checking...",
|
||
"REPAIR": "Repair",
|
||
"REPAIRING": "Repairing...",
|
||
"OK_LABEL": "OK",
|
||
"FAILS_LABEL": "failures",
|
||
"WARN_LABEL": "warnings",
|
||
"OF_TOTAL": "of {total} checks",
|
||
"VERDICT_PASS": "Ready to ship",
|
||
"VERDICT_FAIL": "Critical failures — fix first",
|
||
"EMPTY": "Select an agent and click Run check to start verification.",
|
||
"EMPTY_RESULTS": "No checks returned — agent removed?",
|
||
"REPAIR_FAILED": "Failed: {message}",
|
||
"REPAIR_OK": "Repaired: {message}",
|
||
"FETCH_FAILED": "Error loading assistants: {message}",
|
||
"VALIDATE_FAILED": "Validation failed: {message}",
|
||
"CATEGORY_DB": "Database",
|
||
"CATEGORY_PRICING": "Pricing",
|
||
"CATEGORY_ROUTING": "Captain → Hermes routing",
|
||
"CATEGORY_HUMANIZATION": "Humanization (typing/delay/gallery)",
|
||
"CATEGORY_MCP": "Registered MCP tools",
|
||
"CATEGORY_OTHER": "Other"
|
||
}
|
||
}
|
||
} |