diff --git a/api/config.py b/api/config.py index 06537086..58fa1d7a 100644 --- a/api/config.py +++ b/api/config.py @@ -8060,7 +8060,7 @@ _SETTINGS_DEFAULTS = { "dashboard_plugins": {}, # plugin_name -> bool, opt-in per plugin (default off per PF-10b) "sidebar_density": "compact", # compact | detailed "auto_title_refresh_every": "0", # adaptive title refresh: 0=off, 5/10/20=every N exchanges - "busy_input_mode": "queue", # behavior when sending while agent is running: queue | interrupt | steer + "default_message_mode": "steer", # behavior when sending while agent is running: queue | interrupt | steer "password_hash": None, # PBKDF2-HMAC-SHA256 hash; None = auth disabled "auth_disabled_acknowledged": False, # user acknowledged unauthenticated risk "provider_cost_budget": None, @@ -8171,6 +8171,12 @@ def load_settings() -> dict: if k not in _SETTINGS_LEGACY_DROP_KEYS } ) + if ( + "default_message_mode" not in stored + and "busy_input_mode" in stored + ): + settings["default_message_mode"] = stored.get("busy_input_mode") + settings.pop("busy_input_mode", None) # Grandfather established installs OFF for show_cli_sessions (#3988). # The default flipped True so NEW users see CLI/TUI/messaging # sessions without hunting for the toggle — but an existing user @@ -8229,7 +8235,7 @@ _SETTINGS_ENUM_VALUES = { "sidebar_density": {"compact", "detailed"}, "font_size": {"small", "default", "large", "xlarge"}, "auto_title_refresh_every": {"0", "5", "10", "20"}, - "busy_input_mode": {"queue", "interrupt", "steer"}, + "default_message_mode": {"queue", "interrupt", "steer"}, "chat_activity_display_mode": {"compact_worklog", "transparent_stream"}, "structured_code_default_view": {"auto", "on", "off"}, } @@ -8323,6 +8329,12 @@ def save_settings(settings: dict) -> dict: "activity_feed_expanded_default" ) settings.pop("activity_feed_expanded_default", None) + if ( + "default_message_mode" not in settings + and "busy_input_mode" in settings + ): + settings["default_message_mode"] = settings.get("busy_input_mode") + settings.pop("busy_input_mode", None) settings.pop("simplified_tool_calling", None) pending_theme = current.get("theme") pending_skin = current.get("skin") diff --git a/docs/rfcs/webui-pending-intent-controls.md b/docs/rfcs/webui-pending-intent-controls.md index 93c5f5d4..d8c3e65a 100644 --- a/docs/rfcs/webui-pending-intent-controls.md +++ b/docs/rfcs/webui-pending-intent-controls.md @@ -100,7 +100,7 @@ of Stop-and-send. ## Settings Model -Current Settings expose `Busy input mode` with three choices: +Current Settings expose `Default message mode` with three choices: - Queue follow-up - Interrupt current turn diff --git a/static/boot.js b/static/boot.js index 949279cb..7480e3c6 100644 --- a/static/boot.js +++ b/static/boot.js @@ -1064,34 +1064,43 @@ function _micToastKeyForRecognitionError(error){ window._micActive=window._micActive||false; window._micPendingSend=window._micPendingSend||false; -// ── Busy input mode eager default (#5167) ─────────────────────────────────── -// The Busy input mode preference (queue/interrupt/steer) is read on the send -// path via `window._busyInputMode||'queue'`. The authoritative value only -// arrives once the async boot IIFE below resolves the `/api/settings` fetch. -// Without an eager value, every send during that boot window silently falls -// back to 'queue', ignoring a saved 'steer'/'interrupt' preference (worse on +// ── Default message mode eager default (#5167 / #5145) ────────────────────── +// The Default message mode preference (queue/interrupt/steer) is read on the +// send path via `window._defaultMessageMode||'steer'`. The authoritative value +// only arrives once the async boot IIFE below resolves the `/api/settings` +// fetch. Without an eager value, every send during that boot window silently +// falls back, ignoring a saved 'queue'/'interrupt' preference (worse on // slow/contended environments like WSL2, see #5132). Mirror the resolved value // into localStorage — the same synchronous-source pattern used by hermes-lang / // hermes-theme — so the very first send after a reload honors the saved choice. -const _BUSY_INPUT_MODES=['queue','interrupt','steer']; -function _normalizeBusyInputMode(mode){ - return _BUSY_INPUT_MODES.includes(mode)?mode:'queue'; +const _DEFAULT_MESSAGE_MODES=['queue','interrupt','steer']; +// Legacy localStorage key (pre-#5145 rename); read it as a fallback so an +// existing user's persisted busy-input-mode preference survives the rename. +const _LEGACY_DEFAULT_MESSAGE_MODE_KEY='hermes-busy-input-mode'; +const _DEFAULT_MESSAGE_MODE_KEY='hermes-default-message-mode'; +function _normalizeDefaultMessageMode(mode){ + return _DEFAULT_MESSAGE_MODES.includes(mode)?mode:'steer'; } -function _persistBusyInputMode(mode){ - const m=_normalizeBusyInputMode(mode); - try{localStorage.setItem('hermes-busy-input-mode',m);}catch(_){} +function _persistDefaultMessageMode(mode){ + const m=_normalizeDefaultMessageMode(mode); + try{localStorage.setItem(_DEFAULT_MESSAGE_MODE_KEY,m);}catch(_){} return m; } -function _readPersistedBusyInputMode(){ +function _readPersistedDefaultMessageMode(){ let stored=null; - try{stored=localStorage.getItem('hermes-busy-input-mode');}catch(_){} - return _normalizeBusyInputMode(stored); + try{ + // Prefer the new key; fall back to the legacy key so a pre-rename + // preference is honored until the next explicit save rewrites the new key. + stored=localStorage.getItem(_DEFAULT_MESSAGE_MODE_KEY); + if(stored===null||stored===undefined) stored=localStorage.getItem(_LEGACY_DEFAULT_MESSAGE_MODE_KEY); + }catch(_){} + return _normalizeDefaultMessageMode(stored); } -window._persistBusyInputMode=_persistBusyInputMode; -window._readPersistedBusyInputMode=_readPersistedBusyInputMode; +window._persistDefaultMessageMode=_persistDefaultMessageMode; +window._readPersistedDefaultMessageMode=_readPersistedDefaultMessageMode; // Eager default set BEFORE the async settings fetch resolves so first sends in -// the boot window honor the persisted preference instead of defaulting to queue. -window._busyInputMode=_readPersistedBusyInputMode(); +// the boot window honor the persisted preference instead of the raw default. +window._defaultMessageMode=_readPersistedDefaultMessageMode(); // ── Extension TTS-engine registry (registerHermesTtsEngine) ────────────────── // Defined at MODULE scope (not inside the voice-mode IIFE below) so the public @@ -2764,7 +2773,11 @@ window._applyTitlebarProfileVisibility=_applyTitlebarProfileVisibility; stringChars:parseInt(s.inflight_state_max_string_chars||60000,10)||60000, jsonChars:parseInt(s.inflight_state_max_json_chars||1500000,10)||1500000, }; - window._busyInputMode=_persistBusyInputMode(s.busy_input_mode); + // #5162 rename + steer default, layered on the #5170 localStorage mirror: + // resolve the mode (new key, legacy busy_input_mode fallback, else 'steer' + // via _normalizeDefaultMessageMode) and persist it so the very first send + // after a reload honors the saved choice. + window._defaultMessageMode=_persistDefaultMessageMode(s.default_message_mode||s.busy_input_mode); window._showBusyPlaceholderHint=!!s.show_busy_placeholder_hint; window._sessionEndlessScrollEnabled=!!s.session_endless_scroll; window._autoScrollFollow=s.auto_scroll_follow!==false; @@ -2890,12 +2903,12 @@ window._applyTitlebarProfileVisibility=_applyTitlebarProfileVisibility; window._structuredCodeAutoTreeLines=10; window._sidebarDensity='compact'; window._pinnedSessionsLimit=3; - // Settings load failed: keep the persisted busy-input-mode preference (the - // eager default already read it from the localStorage mirror) instead of - // clobbering it with 'queue', so a saved 'steer'/'interrupt' still applies + // Settings load failed: keep the persisted default-message-mode preference + // (the eager default already read it from the localStorage mirror) instead + // of clobbering it, so a saved 'steer'/'interrupt'/'queue' still applies // when the server is unreachable (#5167). The placeholder-hint has no // persisted mirror, so it defaults off on failure. - window._busyInputMode=_readPersistedBusyInputMode(); + window._defaultMessageMode=_readPersistedDefaultMessageMode(); window._showBusyPlaceholderHint=false; window._sessionEndlessScrollEnabled=false; window._autoScrollFollow=true; diff --git a/static/commands.js b/static/commands.js index 2674b683..a2acec23 100644 --- a/static/commands.js +++ b/static/commands.js @@ -1273,12 +1273,12 @@ async function cmdGoal(args){ } // ── Busy-input mode commands ────────────────────────────────────────────── -// These commands let users override the default busy_input_mode setting for a +// These commands let users override the default message mode setting for a // specific message. They are only meaningful while the agent is running. /** * /queue — Explicitly queue a message for the next turn. - * Works regardless of the busy_input_mode setting. + * Works regardless of the default message mode setting. */ async function cmdQueue(args){ const msg=(args||'').trim(); @@ -1403,7 +1403,7 @@ function _showSteerRecovery(msg, explicitSteer, fallback) { } /** - * Shared implementation for /steer and the busy_input_mode='steer' path. + * Shared implementation for /steer and the default_message_mode='steer' path. * * Tries the real steer endpoint first. On any non-accept response (no cached * agent, agent lacks steer, stream dead, etc.) it restores the draft and keeps diff --git a/static/i18n.js b/static/i18n.js index 218eeae3..2d95a48d 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -309,17 +309,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Interrupted — sending new message', - settings_label_busy_input_mode: 'Busy input mode', - settings_desc_busy_input_mode: 'Controls what happens when you send a message while the agent is running. Queue waits; Interrupt cancels and starts fresh; Steer injects a correction mid-turn without interrupting. If Steer is unavailable, the draft is restored so you can choose the next action.', + settings_label_default_message_mode: 'Default message mode', + settings_desc_default_message_mode: 'Controls what happens when you send a message while the agent is running. Queue waits; Interrupt cancels and starts fresh; Steer injects a correction mid-turn without interrupting. If Steer is unavailable, the draft is restored so you can choose the next action.', settings_label_fade_text_effect: 'Fade text effect', settings_desc_fade_text_effect: 'Fade newly streamed words in while the assistant is responding. Similar to OpenWebUI; off by default for maximum performance.', settings_label_max_tokens: 'Max output tokens', settings_desc_max_tokens: 'Caps assistant output for new streaming turns. Leave blank to use the active profile config fallback.', settings_placeholder_max_tokens_none: 'No override', settings_placeholder_max_tokens_fallback: 'No override (fallback: {0})', - settings_busy_input_mode_queue: 'Queue follow-up', - settings_busy_input_mode_interrupt: 'Interrupt current turn', - settings_busy_input_mode_steer: 'Steer (mid-turn correction)', + settings_default_message_mode_queue: 'Queue follow-up', + settings_default_message_mode_interrupt: 'Interrupt current turn', + settings_default_message_mode_steer: 'Steer (mid-turn correction)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -1978,17 +1978,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Interrotto — invio nuovo messaggio', - settings_label_busy_input_mode: 'Modalità input occupato', - settings_desc_busy_input_mode: "Controlla cosa succede quando invii un messaggio mentre l'agente è in esecuzione. Coda attende; Interrompi annulla e ricomincia; Steer inietta una correzione a metà turno senza interrompere (fallback a coda se agente o stream non disponibili).", + settings_label_default_message_mode: 'Modalità messaggio predefinita', + settings_desc_default_message_mode: "Controlla cosa succede quando invii un messaggio mentre l'agente è in esecuzione. Coda attende; Interrompi annulla e ricomincia; Steer inietta una correzione a metà turno senza interrompere. Se Steer non è disponibile, la bozza viene ripristinata così puoi scegliere l'azione successiva.", settings_label_fade_text_effect: 'Effetto dissolvenza testo', settings_desc_fade_text_effect: 'Dissolve gradualmente le nuove parole trasmesse in streaming mentre l’assistente risponde. Simile a OpenWebUI; disattivato per impostazione predefinita per massime prestazioni.', settings_label_max_tokens: 'Token massimi in uscita', settings_desc_max_tokens: 'Limita la lunghezza delle nuove risposte in streaming. Lascia vuoto per usare il valore di fallback del profilo attivo.', settings_placeholder_max_tokens_none: 'Nessun override', settings_placeholder_max_tokens_fallback: 'Nessun override (fallback: {0})', - settings_busy_input_mode_queue: 'Accoda follow-up', - settings_busy_input_mode_interrupt: 'Interrompi turno corrente', - settings_busy_input_mode_steer: 'Steer (correzione a metà turno)', + settings_default_message_mode_queue: 'Accoda follow-up', + settings_default_message_mode_interrupt: 'Interrompi turno corrente', + settings_default_message_mode_steer: 'Steer (correzione a metà turno)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -3638,17 +3638,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: '中断 — 新しいメッセージを送信中', - settings_label_busy_input_mode: 'ビジー時の入力モード', - settings_desc_busy_input_mode: 'エージェント実行中にメッセージを送信した時の動作を制御します。Queue は待機、Interrupt はキャンセルして再開、Steer は中断せずにターン中に修正を注入します (エージェントやストリームが利用不可ならキューにフォールバック)。', + settings_label_default_message_mode: '既定のメッセージモード', + settings_desc_default_message_mode: 'エージェント実行中にメッセージを送信した時の動作を制御します。Queue は待機、Interrupt はキャンセルして再開、Steer は中断せずにターン中に修正を注入します。Steer が利用できない場合は、下書きが復元されるため、次の操作を選べます。', settings_label_fade_text_effect: 'テキストのフェード効果', settings_desc_fade_text_effect: 'アシスタントの応答中に新しくストリーミングされた単語をフェードインします。OpenWebUI に似た表示です。最大パフォーマンスのため既定ではオフです。', settings_label_max_tokens: '最大出力トークン数', settings_desc_max_tokens: '新しいストリーミング応答の出力量を制限します。空欄のままにすると、現在のプロファイルのフォールバック値を使います。', settings_placeholder_max_tokens_none: '上書きなし', settings_placeholder_max_tokens_fallback: '上書きなし(フォールバック: {0})', - settings_busy_input_mode_queue: 'フォローアップをキュー', - settings_busy_input_mode_interrupt: '現在のターンを中断', - settings_busy_input_mode_steer: 'ステア (ターン中の修正)', + settings_default_message_mode_queue: 'フォローアップをキュー', + settings_default_message_mode_interrupt: '現在のターンを中断', + settings_default_message_mode_steer: 'ステア (ターン中の修正)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -5249,17 +5249,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Прервано — отправка нового сообщения', - settings_label_busy_input_mode: 'Режим ввода при занятости', - settings_desc_busy_input_mode: 'Определяет поведение при отправке сообщения во время работы агента. Очередь ждёт; Прерывание отменяет и начинает заново; Steer внедряет коррекцию без прерывания.', + settings_label_default_message_mode: 'Режим сообщений по умолчанию', + settings_desc_default_message_mode: 'Определяет поведение при отправке сообщения во время работы агента. Очередь ждёт; Прерывание отменяет и начинает заново; Steer внедряет коррекцию без прерывания. Если Steer недоступен, черновик восстанавливается, чтобы вы могли выбрать следующее действие.', settings_label_fade_text_effect: 'Эффект плавного появления текста', settings_desc_fade_text_effect: 'Плавно показывает новые слова во время ответа ассистента. Похоже на OpenWebUI; по умолчанию выключено для максимальной производительности.', settings_label_max_tokens: 'Максимум выходных токенов', settings_desc_max_tokens: 'Ограничивает длину новых потоковых ответов. Оставьте пустым, чтобы использовать резервное значение текущего профиля.', settings_placeholder_max_tokens_none: 'Переопределения нет', settings_placeholder_max_tokens_fallback: 'Переопределения нет (резерв: {0})', - settings_busy_input_mode_queue: 'Поставить в очередь', - settings_busy_input_mode_interrupt: 'Прервать текущий оборот', - settings_busy_input_mode_steer: 'Steer (прерывание + отправка)', + settings_default_message_mode_queue: 'Поставить в очередь', + settings_default_message_mode_interrupt: 'Прервать текущий оборот', + settings_default_message_mode_steer: 'Steer (коррекция в середине хода)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -6896,17 +6896,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Interrumpido \u2014 enviando nuevo mensaje', - settings_label_busy_input_mode: 'Modo de entrada ocupada', - settings_desc_busy_input_mode: 'Controla qué sucede al enviar mensajes mientras el agente está activo. Cola espera; Interrumpir cancela y empieza de nuevo; Steer inyecta una corrección sin interrumpir (usa cola si el agente no está disponible).', + settings_label_default_message_mode: 'Modo de mensaje predeterminado', + settings_desc_default_message_mode: 'Controla qué sucede al enviar mensajes mientras el agente está activo. Cola espera; Interrumpir cancela y empieza de nuevo; Steer inyecta una corrección sin interrumpir. Si Steer no está disponible, el borrador se restaura para que puedas elegir la siguiente acción.', settings_label_fade_text_effect: 'Efecto de desvanecimiento de texto', settings_desc_fade_text_effect: 'Hace aparecer gradualmente las palabras nuevas mientras el asistente responde. Similar a OpenWebUI; desactivado por defecto para máximo rendimiento.', settings_label_max_tokens: 'Máximo de tokens de salida', settings_desc_max_tokens: 'Limita la longitud de las nuevas respuestas en streaming. Déjalo en blanco para usar el valor de respaldo del perfil activo.', settings_placeholder_max_tokens_none: 'Sin reemplazo', settings_placeholder_max_tokens_fallback: 'Sin reemplazo (respaldo: {0})', - settings_busy_input_mode_queue: 'Poner en cola', - settings_busy_input_mode_interrupt: 'Interrumpir turno actual', - settings_busy_input_mode_steer: 'Steer (corrección a mitad de turno)', + settings_default_message_mode_queue: 'Poner en cola', + settings_default_message_mode_interrupt: 'Interrumpir turno actual', + settings_default_message_mode_steer: 'Steer (corrección a mitad de turno)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -8464,17 +8464,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Unterbrochen \u2014 neue Nachricht wird gesendet', - settings_label_busy_input_mode: 'Eingabemodus bei Besch\u00e4ftigung', - settings_desc_busy_input_mode: 'Steuert, was passiert, wenn Sie w\u00e4hrend der Agentenaktivit\u00e4t eine Nachricht senden. Warteschlange wartet; Unterbrechen bricht ab und startet neu; Steer f\u00fcgt eine Korrektur ein ohne zu unterbrechen.', + settings_label_default_message_mode: 'Standard-Nachrichtenmodus', + settings_desc_default_message_mode: 'Steuert, was passiert, wenn Sie w\u00e4hrend der Agentenaktivit\u00e4t eine Nachricht senden. Warteschlange wartet; Unterbrechen bricht ab und startet neu; Steer f\u00fcgt eine Korrektur ein ohne zu unterbrechen. Wenn Steer nicht verf\u00fcgbar ist, wird der Entwurf wiederhergestellt, damit Sie die n\u00e4chste Aktion w\u00e4hlen k\u00f6nnen.', settings_label_fade_text_effect: 'Text-Fade-Effekt', settings_desc_fade_text_effect: 'Blendet neu gestreamte Wörter während der Antwort des Assistenten sanft ein. Ähnlich wie OpenWebUI; für maximale Leistung standardmäßig deaktiviert.', settings_label_max_tokens: 'Maximale Ausgabetokens', settings_desc_max_tokens: 'Begrenzt die Länge neuer Streaming-Antworten. Leer lassen, um den Fallback-Wert des aktiven Profils zu verwenden.', settings_placeholder_max_tokens_none: 'Keine Überschreibung', settings_placeholder_max_tokens_fallback: 'Keine Überschreibung (Fallback: {0})', - settings_busy_input_mode_queue: 'In Warteschlange einreihen', - settings_busy_input_mode_interrupt: 'Aktuellen Durchgang unterbrechen', - settings_busy_input_mode_steer: 'Steer (Korrektur ohne Unterbrechung)', + settings_default_message_mode_queue: 'In Warteschlange einreihen', + settings_default_message_mode_interrupt: 'Aktuellen Durchgang unterbrechen', + settings_default_message_mode_steer: 'Steer (Korrektur ohne Unterbrechung)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -10091,17 +10091,17 @@ const LOCALES = { steer_recovery_retry: '重试', steer_recovery_dismiss: '忽略', busy_interrupt_confirm: '已中断 — 正在发送新消息', - settings_label_busy_input_mode: '忙碌输入模式', - settings_desc_busy_input_mode: '控制当代理正在运行时你发送消息会发生什么。队列会等待;中断会取消并重新开始;引导会在不中断的情况下注入中间修正(当流不可用时回退到队列)。', + settings_label_default_message_mode: '默认消息模式', + settings_desc_default_message_mode: '控制当代理正在运行时你发送消息会发生什么。队列会等待;中断会取消并重新开始;引导会在不中断的情况下注入中间修正。如果引导不可用,将恢复草稿,方便你选择下一步操作。', settings_label_fade_text_effect: '淡入文字效果', settings_desc_fade_text_effect: '在助手回复时淡入新流式单词。类似于 OpenWebUI;默认关闭以获得最佳性能。', settings_label_max_tokens: '最大输出令牌数', settings_desc_max_tokens: '限制新的流式响应可生成的输出量。留空时使用当前配置文件中的回退值。', settings_placeholder_max_tokens_none: '无覆盖', settings_placeholder_max_tokens_fallback: '无覆盖(回退值:{0})', - settings_busy_input_mode_queue: '队列后续消息', - settings_busy_input_mode_interrupt: '中断当前轮次', - settings_busy_input_mode_steer: '引导(中间修正)', + settings_default_message_mode_queue: '队列后续消息', + settings_default_message_mode_interrupt: '中断当前轮次', + settings_default_message_mode_steer: '引导(中间修正)', settings_label_busy_placeholder_hint: '显示忙碌占位提示', settings_desc_busy_placeholder_hint: '在会话运行且草稿为空时,显示带有当前忙碌操作的编辑器占位符。', composer_placeholder_busy_queue: 'Enter = 队列 | /interrupt | /background | /steer', @@ -11695,17 +11695,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: '已中斷,正在傳送新訊息', - settings_label_busy_input_mode: '忙碌輸入模式', - settings_desc_busy_input_mode: '控制 Agent 執行時送出訊息的行為。佇列會等待;中斷會取消並重新開始;Steer 會中途注入修正且不中斷(Agent 或串流無法使用時會退回佇列)。', + settings_label_default_message_mode: '預設訊息模式', + settings_desc_default_message_mode: '控制 Agent 執行時送出訊息的行為。佇列會等待;中斷會取消並重新開始;Steer 會中途注入修正且不中斷。如果 Steer 不可用,會恢復草稿,方便你選擇下一步操作。', settings_label_fade_text_effect: '文字淡入效果', settings_desc_fade_text_effect: '在助理回覆時讓新串流輸出的詞語淡入顯示。類似 OpenWebUI;為獲得最佳效能預設關閉。', settings_label_max_tokens: '最大輸出權杖數', settings_desc_max_tokens: '限制新的串流回覆可產生的輸出量。留空時使用目前設定檔中的回退值。', settings_placeholder_max_tokens_none: '無覆寫', settings_placeholder_max_tokens_fallback: '無覆寫(回退值:{0})', - settings_busy_input_mode_queue: '加入佇列', - settings_busy_input_mode_interrupt: '中斷目前回合', - settings_busy_input_mode_steer: 'Steer(中途修正)', + settings_default_message_mode_queue: '加入佇列', + settings_default_message_mode_interrupt: '中斷目前回合', + settings_default_message_mode_steer: 'Steer(中途修正)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -13284,17 +13284,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Interrompido — enviando nova mensagem', - settings_label_busy_input_mode: 'Modo de input ocupado', - settings_desc_busy_input_mode: 'Controla o que acontece ao enviar mensagem com agente rodando. Fila espera; Interromper cancela; Steer injeta correção.', + settings_label_default_message_mode: 'Modo de mensagem padrão', + settings_desc_default_message_mode: 'Controla o que acontece ao enviar mensagem com agente rodando. Fila espera; Interromper cancela e recomeça; Steer injeta correção no meio do turno sem interromper. Se Steer não estiver disponível, o rascunho é restaurado para você escolher a próxima ação.', settings_label_fade_text_effect: 'Efeito de fade no texto', settings_desc_fade_text_effect: 'Faz novas palavras aparecerem gradualmente enquanto o assistente responde. Similar ao OpenWebUI; desativado por padrão para melhor desempenho.', settings_label_max_tokens: 'Máximo de tokens de saída', settings_desc_max_tokens: 'Limita o tamanho das novas respostas em streaming. Deixe em branco para usar o valor de fallback do perfil ativo.', settings_placeholder_max_tokens_none: 'Sem substituição', settings_placeholder_max_tokens_fallback: 'Sem substituição (fallback: {0})', - settings_busy_input_mode_queue: 'Enfileirar follow-up', - settings_busy_input_mode_interrupt: 'Interromper turno atual', - settings_busy_input_mode_steer: 'Steer (correção no meio do turno)', + settings_default_message_mode_queue: 'Enfileirar follow-up', + settings_default_message_mode_interrupt: 'Interromper turno atual', + settings_default_message_mode_steer: 'Steer (correção no meio do turno)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -14827,17 +14827,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Interrupted — sending new message', - settings_label_busy_input_mode: '작업 중 입력 방식', - settings_desc_busy_input_mode: '에이전트가 실행 중일 때 메시지를 보내면 어떻게 처리할지 제어합니다. 대기는 다음 차례까지 기다리고, 중단은 현재 작업을 취소하고 새로 시작하며, 조정은 현재 작업을 중단하지 않고 중간 수정 사항을 전달합니다(에이전트 또는 스트림을 사용할 수 없으면 대기로 전환).', + settings_label_default_message_mode: '기본 메시지 모드', + settings_desc_default_message_mode: '에이전트가 실행 중일 때 메시지를 보내면 어떻게 처리할지 제어합니다. 대기는 다음 차례까지 기다리고, 중단은 현재 작업을 취소하고 새로 시작하며, 조정은 현재 작업을 중단하지 않고 중간 수정 사항을 전달합니다. 조정을 사용할 수 없으면 초안이 복원되어 다음 동작을 선택할 수 있습니다.', settings_label_fade_text_effect: '텍스트 페이드 효과', settings_desc_fade_text_effect: '어시스턴트가 응답하는 동안 새로 스트리밍되는 단어를 부드럽게 표시합니다. OpenWebUI와 비슷하며, 최대 성능을 위해 기본값은 꺼짐입니다.', settings_label_max_tokens: '최대 출력 토큰', settings_desc_max_tokens: '새 스트리밍 응답의 출력 길이를 제한합니다. 비워 두면 현재 프로필의 대체 값을 사용합니다.', settings_placeholder_max_tokens_none: '재정의 없음', settings_placeholder_max_tokens_fallback: '재정의 없음(대체값: {0})', - settings_busy_input_mode_queue: '후속 메시지 대기', - settings_busy_input_mode_interrupt: '현재 작업 중단', - settings_busy_input_mode_steer: '조정(중간 수정)', + settings_default_message_mode_queue: '후속 메시지 대기', + settings_default_message_mode_interrupt: '현재 작업 중단', + settings_default_message_mode_steer: '조정(중간 수정)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -16479,17 +16479,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Interrompu — envoi d\'un nouveau message', - settings_label_busy_input_mode: 'Mode de saisie lorsque occupé', - settings_desc_busy_input_mode: 'Contrôle ce qui se passe lorsque vous envoyez un message pendant que l\'agent est en cours d\'exécution. File d\'attente attend ; Interruption annule et recommence ; Steer injecte une correction en milieu de tour sans interrompre. Si Steer est indisponible, le brouillon est restauré pour que vous puissiez choisir la prochaine action.', + settings_label_default_message_mode: 'Mode de message par défaut', + settings_desc_default_message_mode: 'Contrôle ce qui se passe lorsque vous envoyez un message pendant que l\'agent est en cours d\'exécution. File d\'attente attend ; Interruption annule et recommence ; Steer injecte une correction en milieu de tour sans interrompre. Si Steer est indisponible, le brouillon est restauré pour que vous puissiez choisir la prochaine action.', settings_label_fade_text_effect: 'Effet de fondu du texte', settings_desc_fade_text_effect: 'Affiche progressivement les nouveaux mots diffusés pendant que l’assistant répond. Similaire à OpenWebUI ; désactivé par défaut pour des performances maximales.', settings_label_max_tokens: 'Nombre maximal de jetons en sortie', settings_desc_max_tokens: 'Limite la longueur des nouvelles réponses en streaming. Laissez vide pour utiliser la valeur de repli du profil actif.', settings_placeholder_max_tokens_none: 'Aucune surcharge', settings_placeholder_max_tokens_fallback: 'Aucune surcharge (repli : {0})', - settings_busy_input_mode_queue: 'Suivi de file d\'attente', - settings_busy_input_mode_interrupt: 'Interrompre le tour en cours', - settings_busy_input_mode_steer: 'Steer (correction en milieu de tour)', + settings_default_message_mode_queue: 'Suivi de file d\'attente', + settings_default_message_mode_interrupt: 'Interrompre le tour en cours', + settings_default_message_mode_steer: 'Steer (correction en milieu de tour)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -18129,17 +18129,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Kesintiye uğradı — yeni mesaj gönderilir', - settings_label_busy_input_mode: 'Meşgul giriş modu', - settings_desc_busy_input_mode: 'Aracı çalışırken bir mesaj gönderdiğinizde ne olacağını kontrol eder. Sıra bekler; Interrupt iptal eder ve yeniden başlar; Steer, dönüşün ortasında kesintiye uğramadan bir düzeltme enjekte eder (aracı veya akış mevcut olmadığında kuyruğa geri döner).', + settings_label_default_message_mode: 'Varsayılan mesaj modu', + settings_desc_default_message_mode: 'Aracı çalışırken bir mesaj gönderdiğinizde ne olacağını kontrol eder. Sıra bekler; Interrupt iptal eder ve yeniden başlar; Steer, dönüşün ortasında kesintiye uğramadan bir düzeltme enjekte eder. Steer kullanılamıyorsa taslak geri yüklenir, böylece sonraki adımı seçebilirsiniz.', settings_label_fade_text_effect: 'Metin efektini soldur', settings_desc_fade_text_effect: 'Asistan yanıt verirken yeni aktarılan sözcüklerin geçişini sağlayın. OpenWebUI\'ye benzer; Maksimum performans için varsayılan olarak kapalıdır.', settings_label_max_tokens: 'Maksimum çıktı belirteci', settings_desc_max_tokens: 'Yeni akış yanıtlarının uzunluğunu sınırlar. Etkin profilin yedek değerini kullanmak için boş bırakın.', settings_placeholder_max_tokens_none: 'Geçersiz kılma yok', settings_placeholder_max_tokens_fallback: 'Geçersiz kılma yok (yedek: {0})', - settings_busy_input_mode_queue: 'Sıra takibi', - settings_busy_input_mode_interrupt: 'Mevcut dönüşü kes', - settings_busy_input_mode_steer: 'Yönlendirme (dönüş ortası düzeltme)', + settings_default_message_mode_queue: 'Sıra takibi', + settings_default_message_mode_interrupt: 'Mevcut dönüşü kes', + settings_default_message_mode_steer: 'Yönlendirme (dönüş ortası düzeltme)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -19775,17 +19775,17 @@ const LOCALES = { steer_recovery_retry: 'Spróbuj ponownie', steer_recovery_dismiss: 'Odrzuć', busy_interrupt_confirm: 'Przerwano — wysyłanie nowej wiadomości', - settings_label_busy_input_mode: 'Tryb wprowadzania przy zajętości', - settings_desc_busy_input_mode: 'Kontroluje, co dzieje się, gdy wysyłasz wiadomość, podczas gdy agent pracuje. Kolejkowanie czeka; Przerwanie anuluje i zaczyna od nowa; Kierowanie (Steer) wprowadza korektę w środku tury bez przerywania (cofa się do kolejkowania, gdy agent lub strumień jest niedostępny).', + settings_label_default_message_mode: 'Domyślny tryb wiadomości', + settings_desc_default_message_mode: 'Kontroluje, co dzieje się, gdy wysyłasz wiadomość, podczas gdy agent pracuje. Kolejkowanie czeka; Przerwanie anuluje i zaczyna od nowa; Kierowanie (Steer) wprowadza korektę w środku tury bez przerywania. Jeśli Steer jest niedostępny, szkic zostaje przywrócony, aby można było wybrać następne działanie.', settings_label_fade_text_effect: 'Efekt pojawiania się tekstu', settings_desc_fade_text_effect: 'Płynne pojawianie się nowo przesyłanych słów, podczas gdy asystent odpowiada. Podobnie jak w OpenWebUI; domyślnie wyłączone dla maksymalnej wydajności.', settings_label_max_tokens: 'Maksymalna liczba tokenów wyjściowych', settings_desc_max_tokens: 'Ogranicza długość nowych odpowiedzi strumieniowanych. Pozostaw puste, aby użyć wartości zapasowej z bieżącego profilu.', settings_placeholder_max_tokens_none: 'Brak nadpisania', settings_placeholder_max_tokens_fallback: 'Brak nadpisania (wartość zapasowa: {0})', - settings_busy_input_mode_queue: 'Kolejkuj tury', - settings_busy_input_mode_interrupt: 'Przerwij bieżącą turę', - settings_busy_input_mode_steer: 'Korekta w trakcie tury (steer)', + settings_default_message_mode_queue: 'Kolejkuj tury', + settings_default_message_mode_interrupt: 'Przerwij bieżącą turę', + settings_default_message_mode_steer: 'Korekta w trakcie tury (steer)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', @@ -21407,17 +21407,17 @@ const LOCALES = { steer_recovery_retry: 'Retry', steer_recovery_dismiss: 'Dismiss', busy_interrupt_confirm: 'Đã ngắt — đang gửi tin nhắn mới', - settings_label_busy_input_mode: 'Chế độ nhập khi bận', - settings_desc_busy_input_mode: 'Điều khiển hành vi khi bạn gửi tin nhắn trong lúc agent đang chạy. Queue sẽ chờ; Interrupt sẽ hủy và bắt đầu mới; Steer sẽ chèn điều chỉnh giữa lượt mà không ngắt (sẽ fallback sang queue nếu agent hoặc stream không khả dụng).', + settings_label_default_message_mode: 'Chế độ tin nhắn mặc định', + settings_desc_default_message_mode: 'Điều khiển hành vi khi bạn gửi tin nhắn trong lúc agent đang chạy. Queue sẽ chờ; Interrupt sẽ hủy và bắt đầu mới; Steer sẽ chèn điều chỉnh giữa lượt mà không ngắt. Nếu Steer không khả dụng, bản nháp sẽ được khôi phục để bạn chọn hành động tiếp theo.', settings_label_fade_text_effect: 'Hiệu ứng mờ chữ', settings_desc_fade_text_effect: 'Làm mờ dần các từ mới stream vào khi assistant đang phản hồi. Tương tự OpenWebUI; mặc định tắt để đạt hiệu năng tối đa.', settings_label_max_tokens: 'Số token đầu ra tối đa', settings_desc_max_tokens: 'Giới hạn độ dài của các phản hồi stream mới. Để trống để dùng giá trị dự phòng của hồ sơ hiện tại.', settings_placeholder_max_tokens_none: 'Không ghi đè', settings_placeholder_max_tokens_fallback: 'Không ghi đè (dự phòng: {0})', - settings_busy_input_mode_queue: 'Xếp hàng phản hồi tiếp theo', - settings_busy_input_mode_interrupt: 'Ngắt lượt hiện tại', - settings_busy_input_mode_steer: 'Steer (điều chỉnh giữa lượt)', + settings_default_message_mode_queue: 'Xếp hàng phản hồi tiếp theo', + settings_default_message_mode_interrupt: 'Ngắt lượt hiện tại', + settings_default_message_mode_steer: 'Steer (điều chỉnh giữa lượt)', settings_label_busy_placeholder_hint: 'Show busy placeholder hint', settings_desc_busy_placeholder_hint: 'Shows the composer placeholder with the current busy action while the session is running and the draft is empty.', composer_placeholder_busy_queue: 'Enter = queue | /interrupt | /background | /steer', diff --git a/static/index.html b/static/index.html index 3ec6114b..a19b4389 100644 --- a/static/index.html +++ b/static/index.html @@ -1320,14 +1320,14 @@
Automatically re-generates the session title based on the latest exchange, keeping it relevant as the conversation evolves. Requires an LLM title generation model to be configured.
-
- - + + + -
Controls what happens when you send a message while the agent is running. Queue waits for the current task; Interrupt cancels and starts fresh; Steer injects a mid-turn correction without interrupting. If Steer is unavailable, the draft is restored so you can choose the next action.
+
Controls what happens when you send a message while the agent is running. Queue waits for the current task; Interrupt cancels and starts fresh; Steer injects a mid-turn correction without interrupting. If Steer is unavailable, the draft is restored so you can choose the next action.