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:
2026-10-16 15:21:42 +00:00
parent 299ea50fb5
commit 2f7a491666
176 changed files with 11869 additions and 2716 deletions

View File

@@ -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."
}
}