dsh-better-workspace 0.30.1 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-external/dsh-better-workspace",
3
- "version": "0.30.1",
3
+ "version": "0.30.2",
4
4
  "main": "./src/index.js",
5
5
  "description": "侧边栏工作区树:按官方磁盘目录嵌套(官方 workspace-tree 语义),可选按名称中的 / 分组(默认关闭,设置里开启);新会话页的工作区选择器同树。Workspace tree for the DSH sidebar workspace list, nested by official disk folders with optional \"/\"-name grouping; the New Session workspace picker shows the same tree.",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-better-workspace",
3
- "version": "0.30.1",
3
+ "version": "0.30.2",
4
4
  "description": "侧边栏工作区树:按官方磁盘目录嵌套(官方 workspace-tree 语义),可选按名称中的 / 分组(默认关闭,设置里开启);新会话页的工作区选择器同树(同一份视图选项即时同步);添加工作区走官方目录流。Workspace tree for the DSH sidebar: disk-path nesting (official workspace-tree semantics), with optional \"/\"-name grouping (off by default), and the same tree in the New Session workspace picker; add-workspace rides the official directory flow.",
5
5
  "type": "module",
6
6
  "repository": {
package/src/client.js CHANGED
@@ -107,6 +107,8 @@ window.__ModuleLoader__.load({
107
107
  'settings.sessionLimit.hint': "展开工作区时先只显示最近的部分会话,其余收进「展开 {n} 个会话」一行,点击展开该组全部;置顶、进行中和等待你的会话始终显示。全部 = 不限量(默认)。",
108
108
  'settings.sessionMenu': "会话右键菜单",
109
109
  'settings.sessionMenu.hint': "开启时右键点击会话行即可打开操作菜单(包含官方的置顶、归档、停止并归档等);关闭后改为在行尾悬停显示官方样式的 ⋯ 按钮,点击打开同一个菜单。默认开启。",
110
+ 'settings.graft.title': "自动标题保留分组前缀",
111
+ 'settings.graft.hint': "「随对话更新的标题」实验功能会把会话改名成不带「/」分组的新名字,分组会因此丢失。开启后本插件视图保留原「/」前缀、只替换最后一段(如 A/xxx 自动变成 A/yyyy)。手动重命名不受影响。默认开启。",
110
112
  'settings.rowActions': "会话行悬停按钮",
111
113
  'settings.rowActions.hint': "悬停会话行时在行尾显示置顶 / 归档快捷按钮,与官方行保持一致;关闭后这些动作只保留在菜单里。默认开启。",
112
114
  'settings.autoStyle': '新增项自动配色',
@@ -263,6 +265,8 @@ window.__ModuleLoader__.load({
263
265
  'settings.sessionLimit.hint': "An expanded workspace first shows only its most recent sessions, the rest behind one Show-more row; pinned, running and waiting-for-you sessions always stay visible. All = no limit (default).",
264
266
  'settings.sessionMenu': "Session context menu",
265
267
  'settings.sessionMenu.hint': "On: right-click a session row to open its action menu (including the official pin, archive, and stop-and-archive). Off: the row shows the official-style ⋯ button on hover instead, opening the same menu. On by default.",
268
+ 'settings.graft.title': "Auto titles keep the group prefix",
269
+ 'settings.graft.hint': "The 'titles that follow the conversation' experiment renames sessions to names without the '/' group, which dissolves the grouping. On, this view keeps the original '/' prefix and swaps only the last segment (A/xxx becomes A/yyyy). Manual renames are unaffected. On by default.",
266
270
  'settings.rowActions': "Session row hover buttons",
267
271
  'settings.rowActions.hint': "Show pin / archive quick buttons at the end of a hovered session row, matching the official rows. Off: these actions stay in the menu only. On by default.",
268
272
  'settings.autoStyle': 'Auto color & icon for new items',
@@ -427,6 +431,8 @@ window.__ModuleLoader__.load({
427
431
  'settings.sessionLimit.hint': "تعرض مساحة العمل الموسعة أحدث الجلسات أولاً، والبقية خلف سطر عرض المزيد؛ الجلسات المثبتة والجارية والمنتظرة لك تبقى مرئية دائماً. الكل = بلا حد (افتراضي).",
428
432
  'settings.sessionMenu': "قائمة النقر الأيمن للجلسة",
429
433
  'settings.sessionMenu.hint': "عند التفعيل: انقر بزر الفأرة الأيمن على سطر الجلسة لفتح قائمة الإجراءات (بما في ذلك التثبيت والأرشفة الرسمية). عند الإيقاف: يظهر زر ⋯ بأسلوب رسمي عند تمرير المؤشر يفتح القائمة نفسها. مفعّل افتراضياً.",
434
+ 'settings.graft.title': "عناوين تلقائية تحتفظ ببادئة المجموعة",
435
+ 'settings.graft.hint': "تجربة 'العناوين التي تتبع المحادثة' تعيد تسمية الجلسات بأسماء بدون مجموعة '/'، فيختفي التقسيم. عند التفعيل يحتفظ هذا العرض بالبادئة الأصلية ويستبدل المقطع الأخير فقط (A/xxx يصبح A/yyyy). إعادة التسمية اليدوية لا تتأثر. مفعّل افتراضيًا.",
430
436
  'settings.rowActions': "أزرار تمرير سطر الجلسة",
431
437
  'settings.rowActions.hint': "إظهار أزرار التثبيت / الأرشفة السريعة في نهاية سطر الجلسة عند تمرير المؤشر، مطابقة للأسطر الرسمية. عند الإيقاف: تبقى هذه الإجراءات في القائمة فقط. مفعّل افتراضياً.",
432
438
  'settings.autoStyle': 'ألوان وأيقونات تلقائية للعناصر الجديدة',
@@ -583,6 +589,8 @@ window.__ModuleLoader__.load({
583
589
  'settings.sessionLimit.hint': "Ein aufgeklappter Arbeitsbereich zeigt zuerst nur die neuesten Sitzungen, der Rest hinter einer Mehr-anzeigen-Zeile; angeheftete, laufende und auf Sie wartende Sitzungen bleiben immer sichtbar. Alle = unbegrenzt (Standard).",
584
590
  'settings.sessionMenu': "Sitzungs-Kontextmenü",
585
591
  'settings.sessionMenu.hint': "Ein: Rechtsklick auf eine Sitzungszeile öffnet das Aktionsmenü (inklusive offiziellem Anheften, Archivieren und Stoppen-und-Archivieren). Aus: beim Daraufzeigen erscheint stattdessen der offizielle ⋯-Knopf am Zeilenende und öffnet dasselbe Menü. Standardmäßig ein.",
592
+ 'settings.graft.title': "Automatische Titel behalten den Gruppenpräfix",
593
+ 'settings.graft.hint': "Das Experiment 'Titel, die der Unterhaltung folgen' benennt Sitzungen ohne '/'-Gruppe um, wodurch die Gruppierung verloren geht. Aktiv behält diese Ansicht den ursprünglichen Präfix und tauscht nur das letzte Segment (A/xxx wird A/yyyy). Manuelle Umbenennungen sind nicht betroffen. Standardmäßig aktiv.",
586
594
  'settings.rowActions': "Sitzungszeilen-Schnellknöpfe",
587
595
  'settings.rowActions.hint': "Zeigt beim Daraufzeigen Schnellknöpfe zum Anheften / Archivieren am Zeilenende – wie die offiziellen Zeilen. Aus: diese Aktionen bleiben nur im Menü. Standardmäßig ein.",
588
596
  'settings.autoStyle': 'Automatische Farbe & Symbol für neue Einträge',
@@ -739,6 +747,8 @@ window.__ModuleLoader__.load({
739
747
  'settings.sessionLimit.hint': "Un espace ouvert montre d’abord ses sessions les plus récentes, le reste derrière une ligne afficher-plus ; les sessions épinglées, en cours et en attente restent toujours visibles. Tout = sans limite (par défaut).",
740
748
  'settings.sessionMenu': "Menu contextuel des sessions",
741
749
  'settings.sessionMenu.hint': "Activé : un clic droit sur une ligne de session ouvre son menu d’actions (épinglage, archivage et arrêt-avec-archivage officiels inclus). Désactivé : la ligne affiche plutôt le bouton ⋯ officiel au survol, ouvrant le même menu. Activé par défaut.",
750
+ 'settings.graft.title': "Les titres automatiques gardent le préfixe de groupe",
751
+ 'settings.graft.hint': "L'expérience 'titres qui suivent la conversation' renomme les sessions sans le groupe '/', ce qui dissout le groupement. Activé, cette vue conserve le préfixe d'origine et ne remplace que le dernier segment (A/xxx devient A/yyyy). Les renommages manuels ne sont pas affectés. Activé par défaut.",
742
752
  'settings.rowActions': "Boutons de survol des sessions",
743
753
  'settings.rowActions.hint': "Affiche des boutons rapides d’épinglage / d’archivage en fin de ligne au survol, comme les lignes officielles. Désactivé : ces actions restent dans le menu uniquement. Activé par défaut.",
744
754
  'settings.autoStyle': 'Couleur et icône automatiques pour les nouveaux éléments',
@@ -895,6 +905,8 @@ window.__ModuleLoader__.load({
895
905
  'settings.sessionLimit.hint': "विस्तारित वर्कस्पेस पहले केवल हाल के सेशन दिखाता है, बाकी एक और-दिखाएँ पंक्ति के पीछे; पिन, चल रहे और आपकी प्रतीक्षा में सेशन सदा दिखते हैं। सभी = असीमित (डिफ़ॉल्ट)।",
896
906
  'settings.sessionMenu': "सेशन संदर्भ मेनू",
897
907
  'settings.sessionMenu.hint': "चालू: सेशन पंक्ति पर राइट-क्लिक करने से उसका क्रिया मेनू खुलता है (आधिकारिक पिन, आर्काइव और रोककर-आर्काइव सहित)। बंद: पंक्ति पर होवर करने पर आधिकारिक शैली का ⋯ बटन दिखता है, जो वही मेनू खोलता है। डिफ़ॉल्ट रूप से चालू।",
908
+ 'settings.graft.title': "स्वतः शीर्षक समूह उपसर्ग रखते हैं",
909
+ 'settings.graft.hint': "'बातचीत के अनुसार शीर्षक' प्रयोग सत्रों का नाम बिना '/' समूह के बदल देता है, जिससे समूहन टूट जाता है। चालू होने पर यह दृश्य मूल उपसर्ग रखता है और केवल अंतिम खंड बदलता है (A/xxx → A/yyyy)। मैन्युअल नाम बदलना प्रभावित नहीं होता। डिफ़ॉल्ट रूप से चालू।",
898
910
  'settings.rowActions': "सेशन पंक्ति होवर बटन",
899
911
  'settings.rowActions.hint': "होवर करने पर सेशन पंक्ति के अंत में पिन / आर्काइव क्विक बटन दिखाता है, आधिकारिक पंक्तियों जैसा। बंद: ये क्रियाएँ केवल मेनू में रहती हैं। डिफ़ॉल्ट रूप से चालू।",
900
912
  'settings.autoStyle': 'नए आइटम के लिए स्वचालित रंग और आइकन',
@@ -1051,6 +1063,8 @@ window.__ModuleLoader__.load({
1051
1063
  'settings.sessionLimit.hint': "Ruang kerja yang dibuka pertama menampilkan sesi terbaru, sisanya di balik satu baris tampilkan-lebih; sesi pin, berjalan, dan menunggu Anda selalu terlihat. Semua = tanpa batas (bawaan).",
1052
1064
  'settings.sessionMenu': "Menu klik kanan sesi",
1053
1065
  'settings.sessionMenu.hint': "Aktif: klik kanan pada baris sesi untuk membuka menu aksinya (termasuk pin, arsip, dan henti-dan-arsip resmi). Nonaktif: baris menampilkan tombol ⋯ gaya resmi saat dihover, membuka menu yang sama. Aktif secara bawaan.",
1066
+ 'settings.graft.title': "Judul otomatis mempertahankan awalan grup",
1067
+ 'settings.graft.hint': "Eksperimen 'judul yang mengikuti percakapan' mengganti nama sesi tanpa grup '/', sehingga pengelompokan hilang. Saat aktif, tampilan ini mempertahankan awalan asli dan hanya mengganti segmen terakhir (A/xxx menjadi A/yyyy). Penggantian nama manual tidak terpengaruh. Aktif secara bawaan.",
1054
1068
  'settings.rowActions': "Tombol hover baris sesi",
1055
1069
  'settings.rowActions.hint': "Menampilkan tombol cepat pin / arsip di ujung baris sesi saat dihover, mengikuti baris resmi. Nonaktif: aksi ini hanya ada di menu. Aktif secara bawaan.",
1056
1070
  'settings.autoStyle': 'Warna & ikon otomatis untuk item baru',
@@ -1207,6 +1221,8 @@ window.__ModuleLoader__.load({
1207
1221
  'settings.sessionLimit.hint': "Un’area aperta mostra prima le sessioni più recenti, il resto dietro una riga mostra-altro; sessioni fissate, in corso e in attesa restano sempre visibili. Tutte = senza limiti (predefinito).",
1208
1222
  'settings.sessionMenu': "Menu contestuale sessione",
1209
1223
  'settings.sessionMenu.hint': "Attivo: il clic destro su una riga di sessione apre il menu azioni (con pin, archiviazione e ferma-e-archivia ufficiali). Disattivo: la riga mostra il pulsante ⋯ ufficiale al passaggio, aprendo lo stesso menu. Attivo per impostazione predefinita.",
1224
+ 'settings.graft.title': "I titoli automatici conservano il prefisso del gruppo",
1225
+ 'settings.graft.hint': "L'esperimento 'titoli che seguono la conversazione' rinomina le sessioni senza il gruppo '/', sciogliendo il raggruppamento. Attivo, questa vista conserva il prefisso originale e sostituisce solo l'ultimo segmento (A/xxx diventa A/yyyy). Le rinomine manuali non sono influenzate. Attivo per impostazione predefinita.",
1210
1226
  'settings.rowActions': "Pulsanti al passaggio della sessione",
1211
1227
  'settings.rowActions.hint': "Mostra pulsanti rapidi di pin / archiviazione in fondo alla riga al passaggio, come le righe ufficiali. Disattivo: queste azioni restano solo nel menu. Attivo per impostazione predefinita.",
1212
1228
  'settings.autoStyle': 'Colore e icona automatici per i nuovi elementi',
@@ -1363,6 +1379,8 @@ window.__ModuleLoader__.load({
1363
1379
  'settings.sessionLimit.hint': "展開したワークスペースは最近のセッションを先に表示し、残りは「さらに表示」行の後ろに収まります。ピン留め・実行中・対応待ちのセッションは常に表示。すべて = 無制限(既定)。",
1364
1380
  'settings.sessionMenu': "セッション右クリックメニュー",
1365
1381
  'settings.sessionMenu.hint': "オン:セッション行を右クリックすると操作メニューを開きます(公式のピン留め・アーカイブ・停止してアーカイブを含む)。オフ:行にカーソルを合わせると公式スタイルの ⋯ ボタンが表示され、同じメニューを開きます。既定はオン。",
1382
+ 'settings.graft.title': "自動タイトルはグループ接頭辞を保持",
1383
+ 'settings.graft.hint': "「会話に合わせて更新されるタイトル」実験機能は「/」グループなしの名前にセッションを改名するため、グルーピングが失われます。オンにすると、このビューは元の「/」接頭辞を保持し最終セグメントだけを差し替えます(A/xxx → A/yyyy)。手動リネームには影響しません。デフォルトでオン。",
1366
1384
  'settings.rowActions': "セッション行のホバーボタン",
1367
1385
  'settings.rowActions.hint': "セッション行にカーソルを合わせると行末にピン / アーカイブのクイックボタンを表示し、公式の行と揃えます。オフ:これらの操作はメニュー内のみ。既定はオン。",
1368
1386
  'settings.autoStyle': '新規項目の色とアイコンを自動割り当て',
@@ -1519,6 +1537,8 @@ window.__ModuleLoader__.load({
1519
1537
  'settings.sessionLimit.hint': "펼친 작업 공간은 최근 세션을 먼저 보여주고 나머지는 더보기 행 뒤에 둡니다. 고정, 실행 중, 대기 중인 세션은 항상 표시됩니다. 전체 = 제한 없음(기본값).",
1520
1538
  'settings.sessionMenu': "세션 우클릭 메뉴",
1521
1539
  'settings.sessionMenu.hint': "켬: 세션 행을 우클릭하면 작업 메뉴가 열립니다(공식 고정, 보관, 중지 후 보관 포함). 끔: 행에 마우스를 올리면 공식 스타일의 ⋯ 버튼이 표시되어 같은 메뉴를 엽니다. 기본값은 켬.",
1540
+ 'settings.graft.title': "자동 제목은 그룹 접두어를 유지",
1541
+ 'settings.graft.hint': "'대화에 따라 업데이트되는 제목' 실험 기능이 '/' 그룹 없는 이름으로 세션 이름을 바꿔 그룹핑이 사라집니다. 켜면 이 뷰는 원래 '/' 접두어를 유지하고 마지막 세그먼트만 교체합니다(A/xxx → A/yyyy). 수동 이름 바꾸기는 영향을 받지 않습니다. 기본적으로 켬.",
1522
1542
  'settings.rowActions': "세션 행 호버 버튼",
1523
1543
  'settings.rowActions.hint': "세션 행에 마우스를 올리면 행 끝에 고정 / 보관 빠른 버튼을 표시하여 공식 행과 일치시킵니다. 끔: 이 작업들은 메뉴에만 남습니다. 기본값은 켬.",
1524
1544
  'settings.autoStyle': '새 항목 자동 색상 및 아이콘',
@@ -1675,6 +1695,8 @@ window.__ModuleLoader__.load({
1675
1695
  'settings.sessionLimit.hint': "Een uitgeklapte werkruimte toont eerst de nieuwste sessies, de rest achter een toon-meer rij; vastgemaakte, lopende en op u wachtende sessies blijven altijd zichtbaar. Alles = onbeperkt (standaard).",
1676
1696
  'settings.sessionMenu': "Sessie-contextmenu",
1677
1697
  'settings.sessionMenu.hint': "Aan: rechtermuisklik op een sessierij opent het actiemenu (inclusief officieel vastmaken, archiveren en stoppen-en-archiveren). Uit: bij aanwijzen verschijnt in plaats daarvan de officiële ⋯-knop aan het rij-einde, die hetzelfde menu opent. Standaard aan.",
1698
+ 'settings.graft.title': "Automatische titels behouden het groepsprefix",
1699
+ 'settings.graft.hint': "Het experiment 'titels die het gesprek volgen' hernoemt sessies naar namen zonder de '/'-groep, waardoor de groepering verloren gaat. Aan: deze weergave behoudt het oorspronkelijke prefix en vervangt alleen het laatste segment (A/xxx wordt A/yyyy). Handmatige hernoemingen zijn niet getroffen. Standaard aan.",
1678
1700
  'settings.rowActions': "Sessierij-snelknoppen",
1679
1701
  'settings.rowActions.hint': "Toont snelknoppen voor vastmaken / archiveren aan het einde van een aangewezen sessierij, gelijk aan de officiële rijen. Uit: deze acties blijven alleen in het menu. Standaard aan.",
1680
1702
  'settings.autoStyle': 'Automatische kleur en pictogram voor nieuwe items',
@@ -1831,6 +1853,8 @@ window.__ModuleLoader__.load({
1831
1853
  'settings.sessionLimit.hint': "Rozwinięty obszar pokazuje najpierw najnowsze sesje, reszta czeka za wierszem pokaż-więcej; przypięte, uruchomione i czekające sesje są zawsze widoczne. Wszystkie = bez limitu (domyślnie).",
1832
1854
  'settings.sessionMenu': "Menu kontekstowe sesji",
1833
1855
  'settings.sessionMenu.hint': "Włączone: kliknięcie prawym przyciskiem wiersza sesji otwiera jego menu akcji (w tym oficjalne przypinanie, archiwizację i zatrzymanie z archiwizacją). Wyłączone: przy najechaniu wiersz pokazuje oficjalny przycisk ⋯ otwierający to samo menu. Domyślnie włączone.",
1856
+ 'settings.graft.title': "Automatyczne tytuły zachowują prefiks grupy",
1857
+ 'settings.graft.hint': "Eksperyment 'tytuły podążające za rozmową' zmienia nazwy sesji na bez grupy '/', co rozbija grupowanie. Włączone: ten widok zachowuje oryginalny prefiks i zamienia tylko ostatni segment (A/xxx staje się A/yyyy). Ręczne zmiany nazwy nie są objęte. Domyślnie włączone.",
1834
1858
  'settings.rowActions': "Przyciski najechania wiersza sesji",
1835
1859
  'settings.rowActions.hint': "Pokazuje szybkie przyciski przypnij / archiwizuj na końcu najechanego wiersza sesji, jak w oficjalnych wierszach. Wyłączone: te akcje zostają tylko w menu. Domyślnie włączone.",
1836
1860
  'settings.autoStyle': 'Automatyczny kolor i ikona dla nowych elementów',
@@ -1987,6 +2011,8 @@ window.__ModuleLoader__.load({
1987
2011
  'settings.sessionLimit.hint': "Um espaço expandido mostra primeiro as sessões mais recentes, o restante atrás de uma linha mostrar-mais; sessões fixadas, em execução e aguardando você permanecem visíveis. Todas = sem limite (predefinição).",
1988
2012
  'settings.sessionMenu': "Menu de contexto da sessão",
1989
2013
  'settings.sessionMenu.hint': "Ligado: clicar com o botão direito numa linha de sessão abre o menu de ações (incluindo fixar, arquivar e parar-e-arquivar oficiais). Desligado: a linha mostra o botão ⋯ oficial ao passar o cursor, abrindo o mesmo menu. Ligado por predefinição.",
2014
+ 'settings.graft.title': "Títulos automáticos mantêm o prefixo do grupo",
2015
+ 'settings.graft.hint': "O experimento 'títulos que acompanham a conversa' renomeia sessões sem o grupo '/', dissolvendo o agrupamento. Ativo: esta visão mantém o prefixo original e troca apenas o último segmento (A/xxx vira A/yyyy). Renomeações manuais não são afetadas. Ativo por padrão.",
1990
2016
  'settings.rowActions': "Botões de passagem da sessão",
1991
2017
  'settings.rowActions.hint': "Mostra botões rápidos de fixar / arquivar no fim da linha ao passar o cursor, como nas linhas oficiais. Desligado: essas ações ficam apenas no menu. Ligado por predefinição.",
1992
2018
  'settings.autoStyle': 'Cor e ícone automáticos para novos itens',
@@ -2143,6 +2169,8 @@ window.__ModuleLoader__.load({
2143
2169
  'settings.sessionLimit.hint': "Развёрнутая область сначала показывает последние сессии, остальные — за строкой «показать ещё»; закреплённые, идущие и ожидающие вас сессии видны всегда. Все = без ограничения (по умолчанию).",
2144
2170
  'settings.sessionMenu': "Контекстное меню сессии",
2145
2171
  'settings.sessionMenu.hint': "Вкл: правый клик по строке сессии открывает меню действий (включая официальные закрепление, архивацию и «остановить и архивировать»). Выкл: при наведении в строке появляется официальная кнопка ⋯, открывающая то же меню. Включено по умолчанию.",
2172
+ 'settings.graft.title': "Автозаголовки сохраняют префикс группы",
2173
+ 'settings.graft.hint': "Эксперимент «заголовки, следующие за беседой» переименовывает сессии в имена без группы «/», из-за чего группировка теряется. Включено: этот вид сохраняет исходный префикс «/» и заменяет только последний сегмент (A/xxx становится A/yyyy). Ручные переименования не затрагиваются. Включено по умолчанию.",
2146
2174
  'settings.rowActions': "Кнопки наведения строки сессии",
2147
2175
  'settings.rowActions.hint': "Показывает быстрые кнопки закрепить / архивировать в конце строки при наведении, как в официальных строках. Выкл: эти действия остаются только в меню. Включено по умолчанию.",
2148
2176
  'settings.autoStyle': 'Автоцвет и значок для новых элементов',
@@ -2299,6 +2327,8 @@ window.__ModuleLoader__.load({
2299
2327
  'settings.sessionLimit.hint': "En utfälld arbetsyta visar först de senaste sessionerna, resten bakom en visa-mer-rad; fästa, pågående och väntande sessioner syns alltid. Alla = obegränsat (standard).",
2300
2328
  'settings.sessionMenu': "Sessionens högerklicksmeny",
2301
2329
  'settings.sessionMenu.hint': "På: högerklick på en sessionsrad öppnar dess åtgärdsmeny (inklusive officiell fästning, arkivering och stoppa-och-arkivera). Av: raden visar istället den officiella ⋯-knappen vid hovring, som öppnar samma meny. På som standard.",
2330
+ 'settings.graft.title': "Automatiska titlar behåller gruppprefixet",
2331
+ 'settings.graft.hint': "Experimentet 'titlar som följer samtalet' döper om sessioner till namn utan '/'-gruppen, vilket löser upp grupperingen. På: den här vyn behåller det ursprungliga prefixet och byter bara ut sista segmentet (A/xxx blir A/yyyy). Manuella namnbyten påverkas inte. På som standard.",
2302
2332
  'settings.rowActions': "Hovringsknappar för sessionsraden",
2303
2333
  'settings.rowActions.hint': "Visar snabbknappar för fäst / arkivera i radens slut vid hovring, som de officiella raderna. Av: åtgärderna finns bara i menyn. På som standard.",
2304
2334
  'settings.autoStyle': 'Automatisk färg och ikon för nya objekt',
@@ -2455,6 +2485,8 @@ window.__ModuleLoader__.load({
2455
2485
  'settings.sessionLimit.hint': "พื้นที่ที่กางจะแสดงเซสชันล่าสุดก่อน ส่วนที่เหลืออยู่หลังแถวแสดงเพิ่ม เซสชันที่ปักหมุด กำลังทำงาน และรอคุณจะแสดงตลอด ทั้งหมด = ไม่จำกัด (ค่าเริ่มต้น)",
2456
2486
  'settings.sessionMenu': "เมนูคลิกขวาของเซสชัน",
2457
2487
  'settings.sessionMenu.hint': "เปิด: คลิกขวาที่แถวเซสชันเพื่อเปิดเมนูการกระทำ (รวมปักหมุด, เก็บถาวร และหยุด-แล้ว-เก็บถาวรแบบทางการ) ปิด: เมื่อชี้ที่แถวจะแสดงปุ่ม ⋯ สไตล์ทางการเปิดเมนูเดียวกันแทน เปิดตามค่าเริ่มต้น",
2488
+ 'settings.graft.title': "ชื่ออัตโนมัติคงคำนำหน้ากลุ่ม",
2489
+ 'settings.graft.hint': "ฟีเจอร์ทดลอง 'ชื่อที่ตามการสนทนา' เปลี่ยนชื่อเซสชันเป็นชื่อที่ไม่มีกลุ่ม '/' ทำให้การจัดกลุ่มหายไป เมื่อเปิด มุมมองนี้จะคงคำนำหน้าเดิมและเปลี่ยนเฉพาะส่วนท้าย (A/xxx กลายเป็น A/yyyy) การเปลี่ยนชื่อด้วยมือไม่ได้รับผลกระทบ เปิดตามค่าเริ่มต้น",
2458
2490
  'settings.rowActions': "ปุ่มเมื่อชี้แถวเซสชัน",
2459
2491
  'settings.rowActions.hint': "แสดงปุ่มด่วนปักหมุด / เก็บถาวรท้ายแถวเมื่อชี้ ให้ตรงกับแถวทางการ ปิด: การกระทำเหล่านี้มีเฉพาะในเมนู เปิดตามค่าเริ่มต้น",
2460
2492
  'settings.autoStyle': 'สีและไอคอนอัตโนมัติสำหรับรายการใหม่',
@@ -2611,6 +2643,8 @@ window.__ModuleLoader__.load({
2611
2643
  'settings.sessionLimit.hint': "Açılan çalışma alanı önce en yeni oturumları gösterir, kalanı bir daha-göster satırının ardındadır; sabitlenmiş, çalışan ve sizi bekleyen oturumlar her zaman görünür. Tümü = sınırsız (varsayılan).",
2612
2644
  'settings.sessionMenu': "Oturum sağ tık menüsü",
2613
2645
  'settings.sessionMenu.hint': "Açık: oturum satırına sağ tıklayınca eylem menüsü açılır (resmî sabitleme, arşivleme ve durdurup-arşivleme dahil). Kapalı: satırın üzerine gelince resmî ⋯ düğmesi görünür ve aynı menüyü açar. Varsayılan açık.",
2646
+ 'settings.graft.title': "Otomatik başlıklar grup önekini korur",
2647
+ 'settings.graft.hint': "Deneme özelliği 'konuşmayı izleyen başlıklar' oturumları '/' grubu olmadan yeniden adlandırır, bu da gruplamayı çözer. Açıkken bu görünüm özgün öneki korur ve yalnızca son bölümü değiştirir (A/xxx, A/yyyy olur). Manuel yeniden adlandırmalar etkilenmez. Varsayılan olarak açık.",
2614
2648
  'settings.rowActions': "Oturum satırı düğmeleri",
2615
2649
  'settings.rowActions.hint': "Üzerine gelince satır sonunda sabitle / arşivle hızlı düğmelerini gösterir, resmî satırlarla aynı. Kapalı: bu eylemler yalnızca menüde kalır. Varsayılan açık.",
2616
2650
  'settings.autoStyle': 'Yeni öğeler için otomatik renk ve simge',
@@ -2767,6 +2801,8 @@ window.__ModuleLoader__.load({
2767
2801
  'settings.sessionLimit.hint': "Không gian được mở rộng sẽ hiện các phiên gần đây trước, phần còn lại nằm sau một hàng xem-thêm; phiên ghim, đang chạy và đang chờ bạn luôn hiển thị. Tất cả = không giới hạn (mặc định).",
2768
2802
  'settings.sessionMenu': "Menu chuột phải phiên",
2769
2803
  'settings.sessionMenu.hint': "Bật: nhấp chuột phải vào dòng phiên để mở menu thao tác (bao gồm ghim, lưu trữ và dừng-rồi-lưu trữ chính thức). Tắt: dòng hiển thị nút ⋯ kiểu chính thức khi di chuột, mở cùng menu đó. Bật theo mặc định.",
2804
+ 'settings.graft.title': "Tiêu đề tự động giữ tiền tố nhóm",
2805
+ 'settings.graft.hint': "Thử nghiệm 'tiêu đề cập nhật theo hội thoại' đổi tên phiên thành tên không có nhóm '/', làm mất phân nhóm. Bật: khung nhìn này giữ tiền tố gốc và chỉ thay đoạn cuối (A/xxx thành A/yyyy). Đổi tên thủ công không bị ảnh hưởng. Bật theo mặc định.",
2770
2806
  'settings.rowActions': "Nút hover dòng phiên",
2771
2807
  'settings.rowActions.hint': "Hiện nút nhanh ghim / lưu trữ ở cuối dòng khi di chuột, giống các dòng chính thức. Tắt: các thao tác này chỉ còn trong menu. Bật theo mặc định.",
2772
2808
  'settings.autoStyle': 'Tự động tô màu và biểu tượng cho mục mới',
@@ -2923,6 +2959,8 @@ window.__ModuleLoader__.load({
2923
2959
  'settings.sessionLimit.hint': "展開工作區時先只顯示最近的部分會話,其餘收進「展開 {n} 個會話」一行,點擊展開該組全部;置頂、進行中和等待你的會話始終顯示。全部 = 不限量(預設)。",
2924
2960
  'settings.sessionMenu': "會話右鍵選單",
2925
2961
  'settings.sessionMenu.hint': "開啟時右鍵點擊會話行即可開啟操作選單(包含官方的置頂、封存、停止並封存等);關閉後改為在行尾懸停顯示官方樣式的 ⋯ 按鈕,點擊開啟同一個選單。預設開啟。",
2962
+ 'settings.graft.title': "自動標題保留分組前綴",
2963
+ 'settings.graft.hint': "「隨對話更新的標題」實驗功能會把會話改名成不帶「/」分組的新名字,分組會因此丟失。開啟後本插件視圖保留原「/」前綴、只替換最後一段(如 A/xxx 自動變成 A/yyyy)。手動重新命名不受影響。預設開啟。",
2926
2964
  'settings.rowActions': "會話行懸停按鈕",
2927
2965
  'settings.rowActions.hint': "懸停會話行時在行尾顯示置頂 / 封存快捷按鈕,與官方行保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
2928
2966
  'settings.autoStyle': '新增項目自動配色',
@@ -3079,6 +3117,8 @@ window.__ModuleLoader__.load({
3079
3117
  'settings.sessionLimit.hint': "展開工作區時先只顯示最近的部分會話,其餘收進「展開 {n} 個會話」一行,點擊展開該組全部;置頂、進行中和等待你的會話始終顯示。全部 = 不限量(預設)。",
3080
3118
  'settings.sessionMenu': "會話右鍵選單",
3081
3119
  'settings.sessionMenu.hint': "開啟時右鍵點擊會話行即可開啟操作選單(包含官方的置頂、歸檔、停止並歸檔等);關閉後改為在行尾懸停顯示官方樣式的 ⋯ 按鈕,點擊開啟同一個選單。預設開啟。",
3120
+ 'settings.graft.title': "自動標題保留分組前綴",
3121
+ 'settings.graft.hint': "「隨對話更新的標題」實驗功能會把會話改名成不帶「/」分組的新名字,分組會因此丟失。開啟後本外掛檢視保留原「/」前綴、只替換最後一段(如 A/xxx 自動變成 A/yyyy)。手動重新命名不受影響。預設開啟。",
3082
3122
  'settings.rowActions': "會話行懸停按鈕",
3083
3123
  'settings.rowActions.hint': "懸停會話行時在行尾顯示置頂 / 歸檔快捷按鈕,與官方行保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
3084
3124
  'settings.autoStyle': '新增項目自動配色',
@@ -3235,6 +3275,8 @@ window.__ModuleLoader__.load({
3235
3275
  'settings.sessionLimit.hint': "展開工作區時先只顯示最近的部分會話,其餘收進「展開 {n} 個會話」一行,點擊展開該組全部;釘選、進行中和等待你的會話始終顯示。全部 = 不限量(預設)。",
3236
3276
  'settings.sessionMenu': "會話右鍵選單",
3237
3277
  'settings.sessionMenu.hint': "開啟時右鍵點擊會話列即可開啟動作選單(包含官方的釘選、封存、停止並封存等);關閉後改為在列尾懸停顯示官方樣式的 ⋯ 按鈕,點擊開啟同一個選單。預設開啟。",
3278
+ 'settings.graft.title': "自動標題保留分組前綴",
3279
+ 'settings.graft.hint': "「隨對話更新的標題」實驗功能會把會話改名成不帶「/」分組的新名字,分組會因此丟失。開啟後本插件檢視保留原「/」前綴、只替換最後一段(如 A/xxx 自動變成 A/yyyy)。手動重新命名不受影響。預設開啟。",
3238
3280
  'settings.rowActions': "會話列懸停按鈕",
3239
3281
  'settings.rowActions.hint': "懸停會話列時在列尾顯示釘選 / 封存快捷按鈕,與官方列保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
3240
3282
  'settings.autoStyle': '新增項目自動配色與圖示',
@@ -4507,6 +4549,24 @@ window.__ModuleLoader__.load({
4507
4549
  // One plain-object batch pass per snapshot (issue #1). Unchanged scans
4508
4550
  // cost one loop with zero allocation; only real changes mark dirty;
4509
4551
  // eviction runs once per changed batch followed by ONE debounced save.
4552
+ // v0.30.2 conversation-following titles: keep the "/" grouping prefix
4553
+ // when an automatic rename replaces only the leaf. prev is the LAST
4554
+ // title shown for the session (grafted display included); next is the
4555
+ // fresh wire title. Returns the grafted full title, or undefined when
4556
+ // next must stand alone: prev missing/prefix-free (nothing to keep),
4557
+ // next blank, or next carrying "/" itself (a deliberate regroup or a
4558
+ // self-grouping auto name — respected verbatim).
4559
+ const graftTitleDisplay = (prev, next) => {
4560
+ if (typeof prev !== 'string' || typeof next !== 'string') return undefined
4561
+ const segs = prev.split('/')
4562
+ if (segs.length < 2) return undefined
4563
+ while (segs.length > 1 && segs[segs.length - 1] === '') segs.pop()
4564
+ if (segs.length < 2) return undefined
4565
+ if (next === '' || next.includes('/')) return undefined
4566
+ segs.pop() // drop the old leaf: only the group prefix survives
4567
+ return segs.join('/') + '/' + next
4568
+ }
4569
+
4510
4570
  const rememberAllTitles = (list) => {
4511
4571
  if (!list || !list.byId) return false
4512
4572
  const byId = titleCache.byId
@@ -4519,7 +4579,11 @@ window.__ModuleLoader__.load({
4519
4579
  if (typeof title !== 'string' || title === '') continue
4520
4580
  const prev = byId[id]
4521
4581
  if (prev && prev.title === title) continue
4522
- byId[id] = { title: title, at: now }
4582
+ const base = prev ? (prev.display || prev.title) : undefined
4583
+ const grafted = graftTitleDisplay(base, title)
4584
+ const entry = { title: title, at: now }
4585
+ if (grafted !== undefined) entry.display = grafted
4586
+ byId[id] = entry
4523
4587
  changed = true
4524
4588
  }
4525
4589
  if (!changed) return false
@@ -6006,6 +6070,8 @@ window.__ModuleLoader__.load({
6006
6070
  const statusPulse = prefs.statusPulse !== false
6007
6071
  const sessionMenu = prefs.sessionMenu !== false
6008
6072
  const rowActions = prefs.rowActions !== false
6073
+ // v0.30.2: auto titles keep the '/' group prefix — on unless opted out.
6074
+ const graftPrefix = prefs.graftTitlePrefix !== false
6009
6075
  // Auto color + icon for new items (v0.24.0): OFF unless explicitly on —
6010
6076
  // the switch is opt-in, and an absent key means off.
6011
6077
  const autoStyle = prefs.autoStyle === true
@@ -6155,6 +6221,18 @@ window.__ModuleLoader__.load({
6155
6221
  }, E('span', { className: 'bw-switch-thumb' })),
6156
6222
  ),
6157
6223
  E('div', { className: 'bw-hint' }, t('settings.sessionMenu.hint')),
6224
+ E('div', { className: 'bw-setting-row' },
6225
+ E('div', { className: 'bw-setting-label' }, t('settings.graft.title')),
6226
+ E('button', {
6227
+ type: 'button',
6228
+ role: 'switch',
6229
+ 'aria-checked': graftPrefix,
6230
+ 'aria-label': t('settings.graft.title'),
6231
+ className: cls('bw-switch', graftPrefix && 'bw-switch-on'),
6232
+ onClick: () => { setPref('graftTitlePrefix', !graftPrefix) },
6233
+ }, E('span', { className: 'bw-switch-thumb' })),
6234
+ ),
6235
+ E('div', { className: 'bw-hint' }, t('settings.graft.hint')),
6158
6236
  E('div', { className: 'bw-setting-row', style: { marginTop: 10 } },
6159
6237
  E('div', { className: 'bw-setting-label' }, t('settings.rowActions')),
6160
6238
  E('button', {
@@ -6803,6 +6881,22 @@ window.__ModuleLoader__.load({
6803
6881
  : {}
6804
6882
  const rememberedTitleOf = (id) => (remembered[id] ? remembered[id].title : undefined)
6805
6883
 
6884
+ // v0.30.2 conversation-following titles: the wire carries no source
6885
+ // marker (user vs provider rename), so grafting is shape-based —
6886
+ // remembered display (prefix + previous leaves) wins only while the
6887
+ // wire title stays group-less. A wire title with "/" and manual
6888
+ // renames (renameByUser forgets the display) always stand verbatim.
6889
+ const rememberedDisplayOf = (id) => (remembered[id] && typeof remembered[id].display === 'string' ? remembered[id].display : undefined)
6890
+ const rowTitleOf = (id, summary, graftedOn) => {
6891
+ if (graftedOn) {
6892
+ const wire = summary && summary.title
6893
+ if (typeof wire === 'string' && wire !== '' && !wire.includes('/')) {
6894
+ const shown = rememberedDisplayOf(id)
6895
+ if (shown) return shown
6896
+ }
6897
+ }
6898
+ return sessionTitleOf(summary, t, rememberedTitleOf(id))
6899
+ }
6806
6900
  // Learn real titles from every snapshot: remember exactly what the
6807
6901
  // wire carried (summary.title), never displayTitle — that is already
6808
6902
  // basename-degraded in the very window this patches. Blank rows are
@@ -6918,6 +7012,9 @@ window.__ModuleLoader__.load({
6918
7012
  if (humanTouchedRef.current === null) humanTouchedRef.current = new Set()
6919
7013
  humanTouchedRef.current.add(String(sessionId))
6920
7014
  if (autoStableRef.current) autoStableRef.current.delete(String(sessionId))
7015
+ // A manual rename is authoritative: forget any grafted display so
7016
+ // the fresh wire title stands verbatim (no prefix re-applied).
7017
+ if (titleCacheRef && typeof titleCacheRef.forgetDisplay === 'function') titleCacheRef.forgetDisplay(String(sessionId))
6921
7018
  return renameSession(sessionId, title)
6922
7019
  }
6923
7020
 
@@ -7081,8 +7178,8 @@ window.__ModuleLoader__.load({
7081
7178
  const st = statusOf(id)
7082
7179
  ungrouped.push({
7083
7180
  id,
7084
- title: sessionTitleOf(summary, t, rememberedTitleOf(id)),
7085
- leaf: sessionTitleOf(summary, t, rememberedTitleOf(id)),
7181
+ title: rowTitleOf(id, summary, prefsMap.graftTitlePrefix !== false),
7182
+ leaf: rowTitleOf(id, summary, prefsMap.graftTitlePrefix !== false),
7086
7183
  blank: !!summary.blank,
7087
7184
  running: (st && st.running === true) || !!summary.running,
7088
7185
  completed: summary.completed === true || (st && st.completionUnread === true),
@@ -7136,8 +7233,8 @@ window.__ModuleLoader__.load({
7136
7233
  const st = statusOf(id)
7137
7234
  rows.push({
7138
7235
  id,
7139
- title: sessionTitleOf(summary, t, rememberedTitleOf(id)),
7140
- leaf: sessionTitleOf(summary, t, rememberedTitleOf(id)),
7236
+ title: rowTitleOf(id, summary, prefsMap.graftTitlePrefix !== false),
7237
+ leaf: rowTitleOf(id, summary, prefsMap.graftTitlePrefix !== false),
7141
7238
  blank: !!summary.blank,
7142
7239
  running: (st && st.running === true) || !!summary.running,
7143
7240
  completed: summary.completed === true || (st && st.completionUnread === true),
@@ -8510,7 +8607,7 @@ window.__ModuleLoader__.load({
8510
8607
  // archive because this session still runs; confirming asks the
8511
8608
  // Host to stop that work first. Copy rides the official dictionary.
8512
8609
  const summary = list && list.byId ? list.byId[dialog.sessionId] : undefined
8513
- const displayTitle = summary ? sessionTitleOf(summary, t, rememberedTitleOf(dialog.sessionId)) : ''
8610
+ const displayTitle = summary ? rowTitleOf(dialog.sessionId, summary, prefsMap.graftTitlePrefix !== false) : ''
8514
8611
  return E(ConfirmDialog, {
8515
8612
  key: 'sess-archive-confirm',
8516
8613
  title: officialText('archive.confirm.title', undefined, t('menu.archive')),
@@ -9053,7 +9150,16 @@ window.__ModuleLoader__.load({
9053
9150
  // reads localStorage synchronously here, before the first render, so a
9054
9151
  // restart's first tree already shows every remembered title.
9055
9152
  loadTitleCache()
9056
- titleCacheRef = { getSnapshot: () => titleCache, rememberAllTitles }
9153
+ titleCacheRef = {
9154
+ getSnapshot: () => titleCache,
9155
+ rememberAllTitles,
9156
+ // Manual renames clear a grafted display (see renameByUser).
9157
+ forgetDisplay: (id) => {
9158
+ const entry = titleCache.byId[id]
9159
+ if (entry && entry.display !== undefined) { delete entry.display; scheduleTitleSave(); return true }
9160
+ return false
9161
+ },
9162
+ }
9057
9163
 
9058
9164
  // Cross-device settings scope (manual sync, see the host-settings-sync
9059
9165
  // block). Binding is best-effort: a missing/failed bind leaves the