feat(chat): turn /btw into an isolated composer (#3398)

* feat(chat): turn /btw into an isolated composer

* fix(chat): preserve direct BTW sends and isolate pending preparation

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
ChangeHow
2026-09-07 23:13:07 +03:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent 7b206b1014
commit 02581d08c5
38 changed files with 1227 additions and 311 deletions
+4
View File
@@ -2028,6 +2028,8 @@ export const dict = {
'chat.btw.toast.destroyFailed': 'Die btw-Sitzung konnte nicht gelöscht werden. Sie bleibt in der Seitenleiste.',
'chat.btw.working': 'Arbeitet…',
'chat.btw.collapseAria': 'btw-Panel einklappen',
'chat.btw.draftHint': 'Stelle deine Frage',
'chat.btw.cancelAria': 'Diese BTW-Frage verwerfen',
'chat.btw.expandAria': 'btw-Panel ausklappen',
'chat.btw.promoteAria': 'Als eigene Sitzung behalten',
'chat.btw.toast.promoteFailed': 'Die btw-Sitzung konnte nicht behalten werden',
@@ -2065,6 +2067,8 @@ export const dict = {
'chat.textSelection.toast.addToNotesSummaryFailed': 'Zusammenfassung der Auswahl nicht möglich, ausgewählter Text wurde zu Notizen hinzugefügt',
'chat.textSelection.actions.addToInput': 'Zur Eingabe hinzufügen',
'chat.textSelection.actions.comment': 'Kommentieren',
'chat.textSelection.actions.askOpenChamber': 'Übrigens…',
'chat.textSelection.title.askOpenChamber': 'BTW-Entwurf mit der Auswahl öffnen',
'chat.textSelection.title.commentOnSelection': 'Auswahl kommentieren',
'chat.textSelection.comment.placeholder': 'Optionalen Kommentar hinzufügen...',
'chat.textSelection.comment.attach': 'Anhängen',
+4
View File
@@ -2237,6 +2237,8 @@ export const dict = {
'chat.btw.toast.destroyFailed': 'Failed to destroy the btw session. It will remain in the sidebar.',
'chat.btw.working': 'Working…',
'chat.btw.collapseAria': 'Collapse the btw panel',
'chat.btw.draftHint': 'Ask your question',
'chat.btw.cancelAria': 'Cancel this BTW question',
'chat.btw.expandAria': 'Expand the btw panel',
'chat.btw.promoteAria': 'Keep as a separate session',
'chat.btw.toast.promoteFailed': 'Failed to keep the btw session',
@@ -2282,6 +2284,8 @@ export const dict = {
'chat.textSelection.toast.addToNotesSummaryFailed': 'Could not summarize selection, added selected text to notes',
'chat.textSelection.actions.addToInput': 'Add to input',
'chat.textSelection.actions.comment': 'Comment',
'chat.textSelection.actions.askOpenChamber': 'By the way…',
'chat.textSelection.title.askOpenChamber': 'Open a BTW draft with the selection',
'chat.textSelection.title.commentOnSelection': 'Comment on selection',
'chat.textSelection.comment.placeholder': 'Add an optional comment...',
'chat.textSelection.comment.attach': 'Attach',
+4
View File
@@ -2214,6 +2214,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': 'No se pudo destruir la sesión btw. Permanecerá en la barra lateral.',
'chat.btw.working': 'Trabajando…',
'chat.btw.collapseAria': 'Contraer el panel btw',
'chat.btw.draftHint': 'Haz tu pregunta',
'chat.btw.cancelAria': 'Cancelar esta pregunta BTW',
'chat.btw.expandAria': 'Expandir el panel btw',
'chat.btw.promoteAria': 'Conservar como sesión aparte',
'chat.btw.toast.promoteFailed': 'No se pudo conservar la sesión btw',
@@ -2260,6 +2262,8 @@ export const dict: Record<I18nKey, string> = {
"chat.textSelection.toast.addToNotesSummaryFailed": "No se pudo resumir la selección; se añadió el texto seleccionado a las notas",
"chat.textSelection.actions.addToInput": "Añadir a la entrada",
"chat.textSelection.actions.comment": "Comentar",
"chat.textSelection.actions.askOpenChamber": "Por cierto…",
"chat.textSelection.title.askOpenChamber": "Abrir un borrador BTW con la selección",
"chat.textSelection.title.commentOnSelection": "Comentar la selección",
"chat.textSelection.comment.placeholder": "Añade un comentario opcional...",
"chat.textSelection.comment.attach": "Adjuntar",
+4
View File
@@ -1963,6 +1963,8 @@ export const dict = {
'chat.btw.toast.destroyFailed': 'Échec de la suppression de la session btw. Elle restera dans la barre latérale.',
'chat.btw.working': 'En cours…',
'chat.btw.collapseAria': 'Réduire le panneau btw',
'chat.btw.draftHint': 'Posez votre question',
'chat.btw.cancelAria': 'Annuler cette question BTW',
'chat.btw.expandAria': 'Développer le panneau btw',
'chat.btw.promoteAria': 'Conserver comme session à part',
'chat.btw.toast.promoteFailed': 'Échec de la conservation de la session btw',
@@ -2005,6 +2007,8 @@ export const dict = {
'chat.textSelection.toast.addToNotesSummaryFailed': 'Impossible de résumer la sélection, ajout du texte sélectionné aux notes',
'chat.textSelection.actions.addToInput': 'Ajouter à la saisie',
'chat.textSelection.actions.comment': 'Commenter',
'chat.textSelection.actions.askOpenChamber': 'Au fait…',
'chat.textSelection.title.askOpenChamber': 'Ouvrir un brouillon BTW avec la sélection',
'chat.textSelection.title.commentOnSelection': 'Commenter la sélection',
'chat.textSelection.comment.placeholder': 'Ajouter un commentaire facultatif...',
'chat.textSelection.comment.attach': 'Joindre',
+4
View File
@@ -2232,6 +2232,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': 'btwセッションを破棄できませんでした。サイドバーに残ります。',
'chat.btw.working': '処理中…',
'chat.btw.collapseAria': 'btwパネルを折りたたむ',
'chat.btw.draftHint': '質問を入力してください',
'chat.btw.cancelAria': 'このBTWの質問をキャンセル',
'chat.btw.expandAria': 'btwパネルを展開する',
'chat.btw.promoteAria': '独立したセッションとして保持',
'chat.btw.toast.promoteFailed': 'btwセッションを保持できませんでした',
@@ -2278,6 +2280,8 @@ export const dict: Record<I18nKey, string> = {
'chat.textSelection.toast.addToNotesSummaryFailed': '選択範囲を要約できませんでした。選択テキストをメモに追加しました。',
'chat.textSelection.actions.addToInput': '入力欄に追加',
'chat.textSelection.actions.comment': 'コメント',
'chat.textSelection.actions.askOpenChamber': 'ところで…',
'chat.textSelection.title.askOpenChamber': '選択したテキストでBTWの下書きを開く',
'chat.textSelection.title.commentOnSelection': '選択範囲にコメント',
'chat.textSelection.comment.placeholder': '任意のコメントを追加...',
'chat.textSelection.comment.attach': '添付',
+4
View File
@@ -2238,6 +2238,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': 'btw 세션을 삭제하지 못했습니다. 사이드바에 남아 있습니다.',
'chat.btw.working': '작업 중…',
'chat.btw.collapseAria': 'btw 패널 접기',
'chat.btw.draftHint': '질문을 입력하세요',
'chat.btw.cancelAria': '이 BTW 질문 취소',
'chat.btw.expandAria': 'btw 패널 펼치기',
'chat.btw.promoteAria': '별도 세션으로 유지',
'chat.btw.toast.promoteFailed': 'btw 세션을 유지하지 못했습니다',
@@ -2284,6 +2286,8 @@ export const dict: Record<I18nKey, string> = {
'chat.textSelection.toast.addToNotesSummaryFailed': '선택 영역을 요약할 수 없어 선택한 텍스트를 메모에 추가함',
'chat.textSelection.actions.addToInput': '입력란에 추가',
'chat.textSelection.actions.comment': '댓글',
'chat.textSelection.actions.askOpenChamber': '그런데…',
'chat.textSelection.title.askOpenChamber': '선택한 텍스트로 BTW 초안 열기',
'chat.textSelection.title.commentOnSelection': '선택 영역에 댓글 달기',
'chat.textSelection.comment.placeholder': '선택적 댓글 추가...',
'chat.textSelection.comment.attach': '첨부',
+4
View File
@@ -886,6 +886,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': 'Nie udało się zniszczyć sesji btw. Pozostanie na pasku bocznym.',
'chat.btw.working': 'Pracuje…',
'chat.btw.collapseAria': 'Zwiń panel btw',
'chat.btw.draftHint': 'Zadaj pytanie',
'chat.btw.cancelAria': 'Anuluj to pytanie BTW',
'chat.btw.expandAria': 'Rozwiń panel btw',
'chat.btw.promoteAria': 'Zachowaj jako osobną sesję',
'chat.btw.toast.promoteFailed': 'Nie udało się zachować sesji btw',
@@ -932,6 +934,8 @@ export const dict: Record<I18nKey, string> = {
'chat.textSelection.toast.addToNotesSummaryFailed': 'Nie można podsumować zaznaczenia, dodano wybrany tekst do notatek',
'chat.textSelection.actions.addToInput': 'Dodaj do pola wpisywania',
'chat.textSelection.actions.comment': 'Skomentuj',
'chat.textSelection.actions.askOpenChamber': 'A tak przy okazji…',
'chat.textSelection.title.askOpenChamber': 'Otwórz szkic BTW z zaznaczonym tekstem',
'chat.textSelection.title.commentOnSelection': 'Skomentuj zaznaczenie',
'chat.textSelection.comment.placeholder': 'Dodaj opcjonalny komentarz...',
'chat.textSelection.comment.attach': 'Załącz',
@@ -2214,9 +2214,13 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': 'Falha ao destruir a sessão btw. Ela permanecerá na barra lateral.',
'chat.btw.working': 'Trabalhando…',
'chat.btw.collapseAria': 'Recolher o painel btw',
'chat.btw.draftHint': 'Faça sua pergunta',
'chat.btw.cancelAria': 'Cancelar esta pergunta BTW',
'chat.btw.expandAria': 'Expandir o painel btw',
'chat.btw.promoteAria': 'Manter como sessão separada',
'chat.btw.toast.promoteFailed': 'Falha ao manter a sessão btw',
'chat.textSelection.actions.askOpenChamber': 'A propósito…',
'chat.textSelection.title.askOpenChamber': 'Abrir um rascunho BTW com a seleção',
"chat.container.readOnlySubagentPromptBanner": "Sessões de subagente não podem receber prompts.",
"chat.container.sessionLoadError.title": "Não foi possível carregar a sessão",
"chat.container.sessionLoadError.description": "Não foi possível buscar a conversa — o servidor pode estar desligado ou inacessível. Nada foi perdido; tente novamente quando ele voltar.",
+4
View File
@@ -3278,6 +3278,8 @@ export const dict = {
'chat.btw.toast.destroyFailed': 'btw session yok edilemedi. Kenar çubuğunda kalacak.',
'chat.btw.working': 'Çalışıyor…',
'chat.btw.collapseAria': 'btw panelini daralt',
'chat.btw.draftHint': 'Sorunuzu sorun',
'chat.btw.cancelAria': 'Bu BTW sorusunu iptal et',
'chat.btw.expandAria': 'btw panelini genişlet',
'chat.btw.promoteAria': 'Ayrı bir session olarak sakla',
'chat.btw.toast.promoteFailed': 'btw session saklanamadı',
@@ -3308,6 +3310,8 @@ export const dict = {
'chat.container.sessionLoadError.authDescription': 'Session\'ınızın süresi doldu, bu yüzden sunucu isteği reddetti. Oturum açın, sohbet yüklenecek.',
'chat.textSelection.actions.addToInput': 'Girdiye ekle',
'chat.textSelection.actions.comment': 'Yorum yap',
'chat.textSelection.actions.askOpenChamber': 'Bu arada…',
'chat.textSelection.title.askOpenChamber': 'Seçili metinle BTW taslağı aç',
'chat.textSelection.title.commentOnSelection': 'Seçime yorum yap',
'chat.textSelection.comment.placeholder': 'İsteğe bağlı bir yorum ekleyin...',
'chat.textSelection.comment.attach': 'Ekle',
+4
View File
@@ -2214,6 +2214,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': 'Не вдалося знищити сесію btw. Вона залишиться в бічній панелі.',
'chat.btw.working': 'Працює…',
'chat.btw.collapseAria': 'Згорнути панель btw',
'chat.btw.draftHint': 'Поставте своє запитання',
'chat.btw.cancelAria': 'Скасувати це запитання BTW',
'chat.btw.expandAria': 'Розгорнути панель btw',
'chat.btw.promoteAria': 'Залишити як окрему сесію',
'chat.btw.toast.promoteFailed': 'Не вдалося залишити сесію btw',
@@ -2260,6 +2262,8 @@ export const dict: Record<I18nKey, string> = {
"chat.textSelection.toast.addToNotesSummaryFailed": "Не вдалося підсумувати виділення, виділений текст додано до нотаток",
"chat.textSelection.actions.addToInput": "Додати в поле вводу",
"chat.textSelection.actions.comment": "Коментувати",
"chat.textSelection.actions.askOpenChamber": "До речі…",
"chat.textSelection.title.askOpenChamber": "Відкрити BTW-чернетку з виділеним текстом",
"chat.textSelection.title.commentOnSelection": "Коментувати виділене",
"chat.textSelection.comment.placeholder": "Додайте коментар за бажанням...",
"chat.textSelection.comment.attach": "Прикріпити",
@@ -2202,6 +2202,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': '销毁 btw 会话失败。它将保留在侧边栏中。',
'chat.btw.working': '处理中…',
'chat.btw.collapseAria': '收起 btw 面板',
'chat.btw.draftHint': '提出你的问题',
'chat.btw.cancelAria': '取消这次 BTW 提问',
'chat.btw.expandAria': '展开 btw 面板',
'chat.btw.promoteAria': '保留为独立会话',
'chat.btw.toast.promoteFailed': '保留 btw 会话失败',
@@ -2248,6 +2250,8 @@ export const dict: Record<I18nKey, string> = {
'chat.textSelection.toast.addToNotesSummaryFailed': '无法总结所选内容,已将所选文本添加到笔记',
'chat.textSelection.actions.addToInput': '添加到输入框',
'chat.textSelection.actions.comment': '评论',
'chat.textSelection.actions.askOpenChamber': '顺便问一下…',
'chat.textSelection.title.askOpenChamber': '用所选文本打开 BTW 草稿',
'chat.textSelection.title.commentOnSelection': '评论所选内容',
'chat.textSelection.comment.placeholder': '添加可选评论...',
'chat.textSelection.comment.attach': '附加',
@@ -2206,6 +2206,8 @@ export const dict: Record<I18nKey, string> = {
'chat.btw.toast.destroyFailed': '銷毀 btw 工作階段失敗。它將保留在側邊欄中。',
'chat.btw.working': '處理中…',
'chat.btw.collapseAria': '收合 btw 面板',
'chat.btw.draftHint': '提出你的問題',
'chat.btw.cancelAria': '取消這次 BTW 提問',
'chat.btw.expandAria': '展開 btw 面板',
'chat.btw.promoteAria': '保留為獨立工作階段',
'chat.btw.toast.promoteFailed': '保留 btw 工作階段失敗',
@@ -2252,6 +2254,8 @@ export const dict: Record<I18nKey, string> = {
'chat.textSelection.toast.addToNotesSummaryFailed': '無法總結所選內容,已將所選文字加入筆記',
'chat.textSelection.actions.addToInput': '加入輸入框',
'chat.textSelection.actions.comment': '留言',
'chat.textSelection.actions.askOpenChamber': '順便問一下…',
'chat.textSelection.title.askOpenChamber': '用所選文字開啟 BTW 草稿',
'chat.textSelection.title.commentOnSelection': '對所選內容留言',
'chat.textSelection.comment.placeholder': '新增選填留言...',
'chat.textSelection.comment.attach': '附加',