feat: harden support, localize knowledge and add operator availability [skip ci]
Source-only publication of reviewed commit 64e96a7f423673dc29ad56485be9fc79bce8af1c.
Passed in isolation: focused frontend/backend tests, race checks, TypeScript typecheck, lint, Go compilation, Flowgram build, and deterministic SDK build/tests.
Not accepted as a production release: Next.js export/native assembly remains blocked by environment memory limits; browser interaction and MySQL staging acceptance remain unverified. No production server, database/schema, runtime configuration, deployment, release tag, or workflow execution was performed.
Expected source tree: 0a4a7528e9.
This commit is contained in:
@@ -26,7 +26,11 @@
|
||||
"actions": "Actions",
|
||||
"name": "Name",
|
||||
"saving": "Saving...",
|
||||
"reset": "Reset"
|
||||
"reset": "Reset",
|
||||
"operationFailed": "The operation failed. Please try again.",
|
||||
"loadFailed": "Could not load data. Please try again.",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled"
|
||||
},
|
||||
"language": {
|
||||
"enUS": "English",
|
||||
@@ -531,9 +535,9 @@
|
||||
"messageSummary": "[Message]",
|
||||
"closedTitle": "Conversation ended",
|
||||
"closedDescription": "This support conversation has been closed. Thanks for chatting with us.",
|
||||
"connecting": "Connecting",
|
||||
"connected": "Online support",
|
||||
"disconnected": "Disconnected",
|
||||
"connecting": "Connecting chat",
|
||||
"connected": "Chat connected",
|
||||
"disconnected": "Chat disconnected",
|
||||
"retry": "Reconnect",
|
||||
"moreActions": "More actions",
|
||||
"minimize": "Minimize window",
|
||||
@@ -583,7 +587,12 @@
|
||||
"startFirstRequest": "Start your first request",
|
||||
"openRequestCount": "{open} open of {total}",
|
||||
"loadConversationsFailed": "Could not load your requests",
|
||||
"createConversationFailed": "Could not create the request"
|
||||
"createConversationFailed": "Could not create the request",
|
||||
"dismissedTitle": "Chat window closed",
|
||||
"dismissedDescription": "Your support request has not been ended. You can return to continue the conversation.",
|
||||
"returnToChat": "Return to chat",
|
||||
"sendUnavailable": "This conversation is unavailable. Return to it or retry before sending.",
|
||||
"sendInProgress": "A message is already being sent."
|
||||
},
|
||||
"dashboardHome": {
|
||||
"rangeToday": "Today",
|
||||
@@ -2493,7 +2502,23 @@
|
||||
"debugAnswer": "Debug Answer",
|
||||
"answerResult": "Answer Result",
|
||||
"searchHits": "Search Hits",
|
||||
"hitsSummary": "{count} hits · {latency}ms"
|
||||
"hitsSummary": "{count} hits · {latency}ms",
|
||||
"unknownType": "Unknown type",
|
||||
"unknownStatus": "Unknown status",
|
||||
"indexFailureSummary": "Indexing failed. Check the indexing configuration and try again.",
|
||||
"requestId": "Request ID",
|
||||
"rerank": "Reranking",
|
||||
"topScore": "Top score",
|
||||
"promptTokens": "Input tokens",
|
||||
"completionTokens": "Output tokens",
|
||||
"traceData": "Trace data",
|
||||
"chunkNumber": "Chunk #{number}",
|
||||
"providerValue": "Strategy: {value}",
|
||||
"scoreValue": "Score: {value}",
|
||||
"rerankValue": "Rerank score: {value}",
|
||||
"historyRecordedNotice": "Historical answers and excerpts are shown as recorded. Changing the interface language does not rewrite them.",
|
||||
"faqNumber": "FAQ #{number}",
|
||||
"documentNumber": "Document #{number}"
|
||||
},
|
||||
"scaffold": {
|
||||
"moduleBoard": "Module Delivery Board",
|
||||
@@ -3370,8 +3395,8 @@
|
||||
"statusReady": "Ready to Receive Requests",
|
||||
"statusNeedsSetup": "Setup Incomplete ({ready}/{total} steps ready)",
|
||||
"stepsProgress": "{ready} of {total} steps ready",
|
||||
"quickSetupAll": "Configure Everything in 1 Click",
|
||||
"quickSetupRunning": "Applying setup...",
|
||||
"quickSetupAll": "Review missing defaults",
|
||||
"quickSetupRunning": "Preparing preview...",
|
||||
"quickFixSuccess": "Configuration updated and routing re-checked",
|
||||
"refresh": "Re-check Readiness",
|
||||
"openSettings": "Open Settings",
|
||||
@@ -3394,12 +3419,12 @@
|
||||
"description": "At least one active operator team is required to group agents and define shift schedules."
|
||||
},
|
||||
"schedules": {
|
||||
"title": "Shift Schedules (Active Now)",
|
||||
"description": "Teams require an active schedule covering the current time; off-hours requests stay in queue."
|
||||
"title": "Active support hours",
|
||||
"description": "Teams need an active support calendar now, using their selected dated-shift or recurring-hours mode. Off-hours requests remain queued."
|
||||
},
|
||||
"operators": {
|
||||
"title": "Operator Profiles & Capacity",
|
||||
"description": "Operators must have an enabled profile, belong to an active team, have auto-assign on, be idle, and have free capacity."
|
||||
"description": "Operators need an enabled account and profile, an active team calendar, a live platform connection, a ready working status, no active vacation, automatic assignment enabled, and available capacity."
|
||||
},
|
||||
"ai_agents": {
|
||||
"title": "AI Agents & Human Handoff",
|
||||
@@ -3433,7 +3458,15 @@
|
||||
"channel_no_agent": "Channel is not connected to an AI agent.",
|
||||
"channel_agent_disabled": "Channel points to a disabled or missing AI agent.",
|
||||
"channel_zero_rollout": "Channel has a 0% AI agent rollout rate.",
|
||||
"no_end_to_end_path": "No channel can successfully route to an available human operator right now."
|
||||
"no_end_to_end_path": "No channel can successfully route to an available human operator right now.",
|
||||
"agent_unpublished": "The agent has no published revision. Publish it in agent settings before using it for a channel.",
|
||||
"channel_agent_unpublished": "The channel points to an unpublished agent. Publish the agent or deliberately choose a published one.",
|
||||
"operator_offline": "The operator has no active connection to the support platform.",
|
||||
"operator_break": "The operator is on break and cannot receive new assignments.",
|
||||
"operator_unavailable": "The operator is unavailable for new assignments.",
|
||||
"operator_vacation": "The operator is currently on scheduled vacation.",
|
||||
"operator_outside_hours": "The operator is outside scheduled working hours.",
|
||||
"operator_availability_unavailable": "The operator’s current availability could not be determined."
|
||||
},
|
||||
"operatorBlockers": {
|
||||
"not_authenticated": "You are not signed in.",
|
||||
@@ -3443,25 +3476,31 @@
|
||||
"team_off_hours": "Your team is currently off-hours (no active shift schedule).",
|
||||
"auto_assign_disabled": "Automatic conversation assignment is disabled for your profile.",
|
||||
"status_busy": "Your status is set to Busy.",
|
||||
"at_capacity": "You have reached your maximum active conversation limit."
|
||||
"at_capacity": "You have reached your maximum active conversation limit.",
|
||||
"offline": "No active connection to the support platform.",
|
||||
"break": "On break: new assignments are paused.",
|
||||
"unavailable": "Unavailable for new assignments.",
|
||||
"vacation": "Scheduled vacation is active.",
|
||||
"availability_unavailable": "Current availability could not be determined.",
|
||||
"user_disabled": "The account is disabled or deleted."
|
||||
},
|
||||
"quickFixLabels": {
|
||||
"quick_setup_all": "Configure Everything in 1 Click",
|
||||
"ensure_team_and_schedule": "Create/Enable Team & 24/7 Schedule",
|
||||
"quick_setup_all": "Review missing defaults",
|
||||
"ensure_team_and_schedule": "Review team setup",
|
||||
"enable_my_operator_profile": "Enable My Reception & Set Idle",
|
||||
"fix_ai_agent_handoff": "Fix AI Agent Handoff & Bind Teams",
|
||||
"ensure_default_channel": "Create/Fix Default Web Channel"
|
||||
},
|
||||
"simulator": {
|
||||
"title": "Operator Route Simulator",
|
||||
"description": "Simulate what happens when a customer sends a message on a channel and see every decision hop in real time.",
|
||||
"description": "Read-only check of current human-only routing eligibility. AI behavior and partial rollout are not simulated, and no message is sent.",
|
||||
"selectChannelPlaceholder": "Select a channel to simulate...",
|
||||
"runSimulation": "Simulate Dispatch",
|
||||
"running": "Simulating...",
|
||||
"outcomeSuccess": "Request WILL reach operator: {operator}",
|
||||
"outcomeBlocked": "Request WILL NOT reach an operator",
|
||||
"outcomeSuccess": "Eligible operator now: {operator}",
|
||||
"outcomeBlocked": "Operator delivery not confirmed",
|
||||
"outcomes": {
|
||||
"assigned_to_operator": "Success: The conversation is assigned to an idle operator.",
|
||||
"assigned_to_operator": "Human-only routing currently has an eligible operator. This is a read-only check, not a delivery guarantee.",
|
||||
"blocked_no_channel": "Blocked: No channels exist or the requested channel was not found.",
|
||||
"blocked_channel_disabled": "Blocked: This channel is disabled.",
|
||||
"blocked_zero_rollout": "Blocked: Channel AI agent rollout rate is set to 0%.",
|
||||
@@ -3469,7 +3508,10 @@
|
||||
"blocked_ai_only_mode": "Blocked: AI agent is set to AI-Only mode and never hands off to human operators.",
|
||||
"blocked_agent_no_teams": "Blocked: AI agent has no valid operator teams assigned for handoff.",
|
||||
"queued_off_hours_no_schedule": "Queued: Target teams have no active shift schedule right now (Off-Hours).",
|
||||
"queued_no_eligible_operator": "Queued: Shift is active, but no idle operators with available capacity are online."
|
||||
"queued_no_eligible_operator": "Queued: Shift is active, but no idle operators with available capacity are online.",
|
||||
"ai_execution_not_simulated": "AI behavior is not simulated; operator delivery is unverified.",
|
||||
"partial_rollout_not_simulated": "Partial rollout is not simulated; operator delivery is unverified.",
|
||||
"blocked_agent_unpublished": "Operator routing is not verified for an unpublished agent. Publish the agent first."
|
||||
},
|
||||
"hops": {
|
||||
"channel": "Channel",
|
||||
@@ -3491,7 +3533,10 @@
|
||||
"blocked_agent_no_teams": "No active teams assigned to this agent",
|
||||
"queued_off_hours_no_schedule": "No active shift schedule covers the current time (Off-Hours)",
|
||||
"queued_no_eligible_operator": "No idle operators with available capacity in active teams",
|
||||
"assigned_to_operator": "Assigned to eligible operator"
|
||||
"assigned_to_operator": "Assigned to eligible operator",
|
||||
"ai_execution_not_simulated": "AI behavior is not simulated; operator delivery is unverified.",
|
||||
"partial_rollout_not_simulated": "Partial rollout is not simulated; operator delivery is unverified.",
|
||||
"blocked_agent_unpublished": "Operator routing is not verified for an unpublished agent. Publish the agent first."
|
||||
},
|
||||
"candidateTableTitle": "Evaluated Operator Candidates",
|
||||
"colOperator": "Operator",
|
||||
@@ -3505,12 +3550,19 @@
|
||||
"eligibleBadge": "Eligible",
|
||||
"skipReasons": {
|
||||
"profile_disabled": "Profile disabled",
|
||||
"user_disabled": "User account disabled",
|
||||
"user_disabled": "The account is disabled or deleted.",
|
||||
"team_not_in_agent": "Team not in agent scope",
|
||||
"team_off_hours": "Team off-hours",
|
||||
"auto_assign_off": "Auto-assign disabled",
|
||||
"status_busy": "Status is Busy",
|
||||
"at_capacity": "At maximum capacity"
|
||||
"at_capacity": "At maximum capacity",
|
||||
"offline": "No active connection to the support platform.",
|
||||
"break": "On break: new assignments are paused.",
|
||||
"unavailable": "Unavailable for new assignments.",
|
||||
"vacation": "Scheduled vacation is active.",
|
||||
"availability_unavailable": "Current availability could not be determined.",
|
||||
"auto_assign_disabled": "Automatic assignment is disabled.",
|
||||
"no_team": "No enabled team is assigned."
|
||||
}
|
||||
},
|
||||
"banner": {
|
||||
@@ -3520,6 +3572,185 @@
|
||||
"headerIndicator": {
|
||||
"readyLabel": "Ready for Chats",
|
||||
"blockedLabel": "Routing Blocked ({count})"
|
||||
},
|
||||
"preview": {
|
||||
"review": "Review setup changes",
|
||||
"title": "Review exact changes before applying",
|
||||
"description": "Only the named records and fields below will change. No shifts are added. Unlisted configurations and rollout percentages remain unchanged. Applying may dispatch pending conversations after the changes commit.",
|
||||
"noChanges": "No safe automatic changes are available. Use the relevant settings to choose a team, route or working hours.",
|
||||
"apply": "Apply reviewed changes",
|
||||
"create": "Create",
|
||||
"update": "Update",
|
||||
"notApplied": "The reviewed changes were not applied.",
|
||||
"manageSchedules": "Manage explicit working hours"
|
||||
},
|
||||
"repairFields": {
|
||||
"name": "Name",
|
||||
"leader_user_id": "Team leader ID",
|
||||
"status": "Enabled status (0 enabled, 1 disabled)",
|
||||
"user_id": "User ID",
|
||||
"team_id": "Team ID / new team name",
|
||||
"team_ids": "Routing teams",
|
||||
"service_status": "Availability (0 idle, 1 busy)",
|
||||
"auto_assign_enabled": "Automatic assignment",
|
||||
"max_concurrent_count": "Concurrent conversation limit",
|
||||
"priority_level": "Assignment priority",
|
||||
"receive_offline_message": "Receive offline messages",
|
||||
"service_mode": "Service mode (1 AI only, 2 human only, 3 AI first)",
|
||||
"rollout_percent": "Agent rollout (%)",
|
||||
"handoff_mode": "Handoff mode (2 team queue)",
|
||||
"fallback_mode": "Fallback mode",
|
||||
"auto_handoff_on_failure": "Automatic handoff on failure",
|
||||
"reply_timeout_seconds": "Reply timeout (seconds)",
|
||||
"max_steps": "Maximum AI steps",
|
||||
"channel_id": "Channel identifier",
|
||||
"channel_type": "Channel type",
|
||||
"ai_agent_id": "Agent ID / new agent name",
|
||||
"ai_agent_rollout_percent": "Channel rollout (%)",
|
||||
"config_json": "Channel configuration"
|
||||
},
|
||||
"repairWarnings": {
|
||||
"schedules_unchanged": "Working hours were not changed. Configure shifts explicitly; being off duty is not a setup error.",
|
||||
"active_team_required": "Select or enable a team in team settings before linking new records.",
|
||||
"disabled_configuration_preserved": "The selected configuration is disabled or has zero rollout and was left unchanged.",
|
||||
"agent_team_selection_required": "Choose the agent’s intended teams in agent settings; no teams were added automatically.",
|
||||
"channel_selection_required": "Choose the intended agent and rollout in channel settings. Existing channel routing was preserved.",
|
||||
"existing_configuration_preserved": "Existing configuration was preserved. Review any remaining readiness issues in the relevant settings.",
|
||||
"dispatch_failed": "Changes were saved, but pending conversation dispatch failed. Review the queue; do not reapply the repair.",
|
||||
"readiness_refresh_failed": "The readiness refresh failed. Reload diagnostics to see the current state; committed changes are not rolled back.",
|
||||
"agent_publication_required": "Publish the intended agent in agent settings before creating a channel. Setup does not publish agents or bypass the publication requirement."
|
||||
}
|
||||
},
|
||||
"supportAvailability": {
|
||||
"title": "Support availability",
|
||||
"description": "Configure support hours and timezones. Connection, working status, and eligibility are separate.",
|
||||
"loading": "Loading availability…",
|
||||
"myStatus": "My availability",
|
||||
"retryStatus": "Status unavailable. Retry",
|
||||
"operatorStatus": "Availability: {name}",
|
||||
"presenceHelp": "Online means an active connection to the support platform, across tabs and devices. It does not mean the operator is accepting new requests.",
|
||||
"online": "On the platform",
|
||||
"offline": "Not connected",
|
||||
"workingStatus": "Working status",
|
||||
"statusHelp": "Your status is saved across sessions. Busy, break, unavailable, and active vacation stop new assignments; signing in does not reset them.",
|
||||
"statusSaved": "Availability saved",
|
||||
"saveFailed": "Could not save changes. Your input is preserved.",
|
||||
"loadFailed": "Could not load availability",
|
||||
"saveStatus": "Save status",
|
||||
"saving": "Saving…",
|
||||
"cancel": "Cancel",
|
||||
"retry": "Retry",
|
||||
"refresh": "Refresh",
|
||||
"discardTitle": "Discard unsaved changes?",
|
||||
"discardDescription": "Your changes have not been saved. Leave without saving them?",
|
||||
"discard": "Discard changes",
|
||||
"vacationStart": "Vacation starts",
|
||||
"vacationEnd": "Vacation ends (exclusive)",
|
||||
"vacationTimezone": "Enter dates in your browser timezone: {timezone}.",
|
||||
"vacationExact": "Exact UTC interval: {start} → {end}.",
|
||||
"vacationHelp": "During this interval, new assignments stop even if you sign in. Outside the interval, the saved return status applies: {status}. Existing conversations are not transferred automatically.",
|
||||
"cancelVacationHelp": "Saving a different status cancels the scheduled vacation.",
|
||||
"invalidVacation": "Enter valid start and end times, with the end after the start. Times skipped by daylight saving are not valid.",
|
||||
"calendar": "Support calendar",
|
||||
"editCalendar": "Edit calendar",
|
||||
"saveCalendar": "Save calendar",
|
||||
"calendarSaved": "Support calendar saved",
|
||||
"readOnly": "You have read-only access.",
|
||||
"deploymentDefault": "Deployment defaults",
|
||||
"selectScope": "Select default or team",
|
||||
"deploymentTimezone": "Default IANA timezone",
|
||||
"teamTimezone": "Team timezone override",
|
||||
"timezoneHelp": "Use an IANA name, such as Europe/Moscow or America/New_York, not a fixed UTC offset.",
|
||||
"inheritTimezoneHelp": "Leave blank to inherit the deployment timezone. A timezone override does not change stored dated shifts.",
|
||||
"effectiveTimezone": "Effective timezone: {timezone}",
|
||||
"scheduleMode": "Calendar mode",
|
||||
"legacy": "Existing dated shifts",
|
||||
"recurring": "Weekly hours and exceptions",
|
||||
"legacyHelp": "Existing dated shifts are preserved and are not reinterpreted in the new timezone. Weekly hours apply only after explicitly selecting and saving the recurring mode.",
|
||||
"viewDatedShifts": "View dated shifts",
|
||||
"legacyActive": "Existing dated shifts remain the source of working hours. No weekly hours are silently created.",
|
||||
"confirmCalendarTitle": "Apply this support calendar?",
|
||||
"confirmRecurring": "Switch to weekly hours and date exceptions for this scope? Existing dated shifts will remain stored but will no longer determine availability in this mode.",
|
||||
"confirmCalendar": "These settings change when new requests can be assigned. Teams inheriting the default timezone are affected by a default timezone change. Dated shifts remain unchanged.",
|
||||
"weeklyHours": "Weekly hours",
|
||||
"hoursHelp": "Add multiple periods for split shifts. An end earlier than the start continues into the next day. Equal start and end is invalid. Days without periods are closed. Use 00:00–24:00 for a full day.",
|
||||
"noWeeklyHours": "No weekly hours. In recurring mode, only explicit open-date exceptions can open support.",
|
||||
"addPeriod": "Add period",
|
||||
"removePeriod": "Remove period",
|
||||
"day": "Day",
|
||||
"start": "Start",
|
||||
"end": "End",
|
||||
"exceptions": "Holidays and date exceptions",
|
||||
"exceptionsHelp": "A date exception replaces that local day's weekly hours. Closed dates block the whole day, including an overnight period from the previous day.",
|
||||
"noExceptions": "No date exceptions",
|
||||
"addException": "Add date exception",
|
||||
"removeException": "Remove date exception",
|
||||
"date": "Date",
|
||||
"closedDay": "Closed all day",
|
||||
"preview": "Calendar preview",
|
||||
"previewHelp": "Preview the current form without saving it. Enter the check time in your browser timezone ({timezone}), or leave it blank for now. Results use the calendar timezone.",
|
||||
"previewAt": "Check time (optional)",
|
||||
"runPreview": "Check calendar",
|
||||
"previewing": "Checking…",
|
||||
"previewFailed": "Could not preview the calendar",
|
||||
"previewStale": "The form changed. Run the preview again.",
|
||||
"scheduleOpen": "The schedule is open at this time.",
|
||||
"scheduleClosed": "The schedule is closed at this time.",
|
||||
"nextOpening": "Next scheduled opening: {time}",
|
||||
"noNextOpening": "No scheduled opening found in the preview window.",
|
||||
"notPresencePromise": "Scheduled hours do not guarantee that an operator will be connected or available.",
|
||||
"invalidTimezone": "Enter a valid IANA timezone. Deployment defaults cannot be blank.",
|
||||
"invalidHours": "Use valid HH:mm intervals with different start and end times. An open exception needs at least one interval.",
|
||||
"invalidExceptionDate": "Each exception needs a valid, unique date.",
|
||||
"invalidPreviewTime": "Enter a valid check time in your browser timezone.",
|
||||
"noPermission": "You do not have permission to view calendar settings. You can still manage your own working status.",
|
||||
"noTeams": "No teams are available for calendar configuration.",
|
||||
"publicChecking": "Checking human support availability…",
|
||||
"publicNextOpening": "Next scheduled opening: {time}. Operator presence is not guaranteed.",
|
||||
"offlineDeprecated": "Legacy setting, retained for compatibility. It does not allow new assignments to disconnected operators.",
|
||||
"manageStatus": "Manage availability",
|
||||
"statusSeparate": "Working status and scheduled vacation are managed separately from the operator profile.",
|
||||
"status": {
|
||||
"ready": "Ready to accept",
|
||||
"busy": "Busy",
|
||||
"break": "On break",
|
||||
"unavailable": "Unavailable",
|
||||
"vacation": "On vacation",
|
||||
"unknown": "Unknown status"
|
||||
},
|
||||
"reason": {
|
||||
"eligible": "Eligible for new assignments",
|
||||
"profile_disabled": "Operator profile is administratively disabled",
|
||||
"user_disabled": "Account is disabled",
|
||||
"team_disabled": "Team is disabled",
|
||||
"outside_hours": "Outside scheduled working hours",
|
||||
"offline": "No active connection to the support platform",
|
||||
"busy": "Busy: new assignments are paused",
|
||||
"break": "On break: new assignments are paused",
|
||||
"unavailable": "Unavailable for new assignments",
|
||||
"vacation": "Scheduled vacation is active",
|
||||
"auto_assign_disabled": "Automatic assignment is disabled",
|
||||
"capacity": "Concurrent conversation limit reached",
|
||||
"unknown": "Eligibility could not be determined"
|
||||
},
|
||||
"public": {
|
||||
"available": "Human support is available now",
|
||||
"outside_hours": "Human support is outside scheduled hours",
|
||||
"temporarily_absent": "No operator is currently available for a new request",
|
||||
"capacity": "Operators are currently at capacity",
|
||||
"unknown": "Human support availability is unknown"
|
||||
},
|
||||
"weekday": {
|
||||
"1": "Monday",
|
||||
"2": "Tuesday",
|
||||
"3": "Wednesday",
|
||||
"4": "Thursday",
|
||||
"5": "Friday",
|
||||
"6": "Saturday",
|
||||
"7": "Sunday"
|
||||
},
|
||||
"dstOccurrence": "{field}: this time occurs twice. Choose the exact UTC instant.",
|
||||
"chooseOccurrence": "Choose occurrence",
|
||||
"datedShiftsNotice": "These dated shifts affect availability only for teams using the existing dated-shift mode. In weekly mode they remain stored but inactive; switching back reactivates them unchanged."
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user