dsh-ide-git 0.14.0 → 0.14.1

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-ide-git",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "main": "./src/index.js",
5
5
  "description": "IDE 级 Git 操作面板:分支树 + 提交图谱 + 变更/暂存/提交 + 提交详情。装了 dsh-better-sidebar 时挂成它的原生 tab(右侧栏 + 底部工作台);没装时直接挂 DSH 原生右侧栏,单独安装即可用。JetBrains 风格 Git 工具窗口 for DeepSeek Harness.",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-ide-git",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "description": "DSH plugin: an IDE-grade Git tool window as a native dsh-better-sidebar tab — branch tree, commit graph, changes, commit details, JetBrains-style actions, in the right sidebar and the bottom panel. | DSH 插件:IDE 级 Git 工具窗口,以 dsh-better-sidebar 原生 Tab 挂载——分支树 / 提交图谱 / 变更与提交详情 / JetBrains 风格操作,右侧栏与底部面板双布局自适应。",
5
5
  "type": "module",
6
6
  "repository": {
package/src/client.js CHANGED
@@ -153,7 +153,6 @@ window.__ModuleLoader__.load({
153
153
  'action.copyHash': '复制修订号',
154
154
  'action.details': '提交详情',
155
155
  'menu.sendToChat': '发送到对话',
156
- 'menu.sendFilePathToChat': '发送文件路径到对话',
157
156
  'send.commitText': 'git 提交 {hash}「{subject}」(仓库 {repo})',
158
157
  'send.branchText': 'git 分支 {name}(仓库 {repo})',
159
158
  'menu.sendDiffLinesToChat': '发送选中行到对话',
@@ -197,6 +196,7 @@ window.__ModuleLoader__.load({
197
196
  'settings.placement.tabHint': '关闭后仍可从右侧栏或底部面板打开。',
198
197
  'settings.placement.immersive': '沉浸模式(占满全高,隐藏输入框)',
199
198
  'settings.placement.immersiveHint': '开启后 Git 标签页占满整个会话区高度,输入框自动收起;审批与提问仍会正常显示。',
199
+ 'preview.openFile': '打开文件预览',
200
200
  'preview.title': 'Git 预览',
201
201
  'preview.hint': '点击文件或提交的「显示差异」,差异会在侧边栏这里打开。',
202
202
  'settings.rail.title': '动作条按钮',
@@ -368,7 +368,6 @@ window.__ModuleLoader__.load({
368
368
  'action.copyHash': 'Copy revision number',
369
369
  'action.details': 'Commit details',
370
370
  'menu.sendToChat': 'Send to chat',
371
- 'menu.sendFilePathToChat': 'Send file path to chat',
372
371
  'send.commitText': 'git commit {hash} "{subject}" (repo {repo})',
373
372
  'send.branchText': 'git branch {name} (repo {repo})',
374
373
  'menu.sendDiffLinesToChat': 'Send selected lines to chat',
@@ -412,6 +411,7 @@ window.__ModuleLoader__.load({
412
411
  'settings.placement.tabHint': 'Off, the panel stays reachable from the right sidebar and the bottom panel.',
413
412
  'settings.placement.immersive': 'Immersive mode (full height, hidden composer)',
414
413
  'settings.placement.immersiveHint': 'On, the Git tab fills the whole conversation area and the composer steps aside; approvals and questions still show.',
414
+ 'preview.openFile': 'Open in the file preview',
415
415
  'preview.title': 'Git Preview',
416
416
  'preview.hint': 'Click “Show diff” on a file or commit — the diff opens here in the sidebar.',
417
417
  'settings.rail.title': 'Action rail buttons',
@@ -591,7 +591,6 @@ window.__ModuleLoader__.load({
591
591
  'action.copyHash': '複製修訂號',
592
592
  'action.details': '提交詳情',
593
593
  'menu.sendToChat': '傳送到對話',
594
- 'menu.sendFilePathToChat': '傳送檔案路徑至對話',
595
594
  'send.commitText': 'git 提交 {hash}「{subject}」(存放庫 {repo})',
596
595
  'send.branchText': 'git 分支 {name}(存放庫 {repo})',
597
596
  'menu.sendDiffLinesToChat': '傳送選中行到對話',
@@ -635,6 +634,7 @@ window.__ModuleLoader__.load({
635
634
  'settings.placement.tabHint': '關閉之後仍可從右側欄或底部面板開啟。',
636
635
  'settings.placement.immersive': '沉浸模式(佔滿全高,隱藏輸入框)',
637
636
  'settings.placement.immersiveHint': '開啟之後 Git 分頁會佔滿整個會話區高度,輸入框自動收起;審批與提問仍會正常顯示。',
637
+ 'preview.openFile': '開啟檔案預覽',
638
638
  'preview.title': 'Git 預覽',
639
639
  'preview.hint': '喺檔案或提交撳「顯示差異」,差異就會喺側邊欄度開啟。',
640
640
  'settings.rail.title': '動作列按鈕',
@@ -806,7 +806,6 @@ window.__ModuleLoader__.load({
806
806
  'action.copyHash': '複製修訂編號',
807
807
  'action.details': '提交詳情',
808
808
  'menu.sendToChat': '傳送至對話',
809
- 'menu.sendFilePathToChat': '傳送檔案路徑至對話',
810
809
  'send.commitText': 'git 提交 {hash}「{subject}」(版本庫 {repo})',
811
810
  'send.branchText': 'git 分支 {name}(版本庫 {repo})',
812
811
  'menu.sendDiffLinesToChat': '傳送選取行至對話',
@@ -850,6 +849,7 @@ window.__ModuleLoader__.load({
850
849
  'settings.placement.tabHint': '關閉之後仍可從右側欄或底部面板開啟。',
851
850
  'settings.placement.immersive': '沉浸模式(佔滿全高,隱藏輸入框)',
852
851
  'settings.placement.immersiveHint': '開啟之後 Git 分頁會佔滿整個對話區高度,輸入框自動收起;審核與提問仍會正常顯示。',
852
+ 'preview.openFile': '開啟檔案預覽',
853
853
  'preview.title': 'Git 預覽',
854
854
  'preview.hint': '點選檔案或提交的「顯示差異」,差異就會在側邊欄開啟。',
855
855
  'settings.rail.title': '動作列按鈕',
@@ -1021,7 +1021,6 @@ window.__ModuleLoader__.load({
1021
1021
  'action.copyHash': '複製修訂號',
1022
1022
  'action.details': '提交詳情',
1023
1023
  'menu.sendToChat': '傳送至對話',
1024
- 'menu.sendFilePathToChat': '傳送檔案路徑至對話',
1025
1024
  'send.commitText': 'git 提交 {hash}「{subject}」(存放庫 {repo})',
1026
1025
  'send.branchText': 'git 分支 {name}(存放庫 {repo})',
1027
1026
  'menu.sendDiffLinesToChat': '傳送選中行至對話',
@@ -1065,6 +1064,7 @@ window.__ModuleLoader__.load({
1065
1064
  'settings.placement.tabHint': '關閉之後仍可從右側欄或底部面板開啟。',
1066
1065
  'settings.placement.immersive': '沉浸模式(佔滿全高,隱藏輸入框)',
1067
1066
  'settings.placement.immersiveHint': '開啟之後 Git 分頁會佔滿整個會話區高度,輸入框自動收起;審批與提問仍會正常顯示。',
1067
+ 'preview.openFile': '開啟檔案預覽',
1068
1068
  'preview.title': 'Git 預覽',
1069
1069
  'preview.hint': '喺檔案或提交撳「顯示差異」,差異就會喺側邊欄度開啟。',
1070
1070
  'settings.rail.title': '動作列按鈕',
@@ -1236,7 +1236,6 @@ window.__ModuleLoader__.load({
1236
1236
  'action.copyHash': 'リビジョン番号をコピー',
1237
1237
  'action.details': 'コミットの詳細',
1238
1238
  'menu.sendToChat': 'チャットへ送る',
1239
- 'menu.sendFilePathToChat': 'ファイルパスをチャットへ送る',
1240
1239
  'send.commitText': 'git コミット {hash}「{subject}」(リポジトリ {repo})',
1241
1240
  'send.branchText': 'git ブランチ {name}(リポジトリ {repo})',
1242
1241
  'menu.sendDiffLinesToChat': '選択した行をチャットへ送る',
@@ -1280,6 +1279,7 @@ window.__ModuleLoader__.load({
1280
1279
  'settings.placement.tabHint': 'オフにしても右サイドバーと下部パネルから開けます。',
1281
1280
  'settings.placement.immersive': '没入モード(全高表示・入力欄を非表示)',
1282
1281
  'settings.placement.immersiveHint': 'オンにすると Git タブが会話エリアの高さいっぱいに広がり、入力欄は引っ込みます。承認や質問は通常どおり表示されます。',
1282
+ 'preview.openFile': 'ファイルプレビューを開く',
1283
1283
  'preview.title': 'Git プレビュー',
1284
1284
  'preview.hint': 'ファイルやコミットの「差分を表示」をクリックすると、差分がここに開きます。',
1285
1285
  'settings.rail.title': 'アクションレールのボタン',
@@ -1451,7 +1451,6 @@ window.__ModuleLoader__.load({
1451
1451
  'action.copyHash': '리비전 번호 복사',
1452
1452
  'action.details': '커밋 상세',
1453
1453
  'menu.sendToChat': '대화로 보내기',
1454
- 'menu.sendFilePathToChat': '파일 경로를 대화로 보내기',
1455
1454
  'send.commitText': 'git 커밋 {hash} "{subject}" (저장소 {repo})',
1456
1455
  'send.branchText': 'git 브랜치 {name} (저장소 {repo})',
1457
1456
  'menu.sendDiffLinesToChat': '선택한 줄 대화로 보내기',
@@ -1495,6 +1494,7 @@ window.__ModuleLoader__.load({
1495
1494
  'settings.placement.tabHint': '꺼도 오른쪽 사이드바와 하단 패널에서 열 수 있습니다.',
1496
1495
  'settings.placement.immersive': '몰입 모드(전체 높이, 입력창 숨김)',
1497
1496
  'settings.placement.immersiveHint': '켜면 Git 탭이 대화 영역 전체 높이를 차지하고 입력창은 숨겨집니다. 승인과 질문은 정상적으로 표시됩니다.',
1497
+ 'preview.openFile': '파일 미리보기로 열기',
1498
1498
  'preview.title': 'Git 미리보기',
1499
1499
  'preview.hint': '파일이나 커밋의 「차이 보기」를 클릭하면 차이가 사이드바 여기에 열립니다.',
1500
1500
  'settings.rail.title': '액션 레일 버튼',
@@ -1666,7 +1666,6 @@ window.__ModuleLoader__.load({
1666
1666
  'action.copyHash': 'Revisionsnummer kopieren',
1667
1667
  'action.details': 'Commit-Details',
1668
1668
  'menu.sendToChat': 'Im Chat senden',
1669
- 'menu.sendFilePathToChat': 'Dateipfad im Chat senden',
1670
1669
  'send.commitText': 'git-Commit {hash} "{subject}" (Repository {repo})',
1671
1670
  'send.branchText': 'git-Branch {name} (Repository {repo})',
1672
1671
  'menu.sendDiffLinesToChat': 'Ausgewählte Zeilen in den Chat senden',
@@ -1710,6 +1709,7 @@ window.__ModuleLoader__.load({
1710
1709
  'settings.placement.tabHint': 'Ausgeschaltet bleibt das Panel über rechte Seitenleiste und unteres Panel erreichbar.',
1711
1710
  'settings.placement.immersive': 'Immersiver Modus (volle Höhe, ausgeblendetes Eingabefeld)',
1712
1711
  'settings.placement.immersiveHint': 'Eingeschaltet füllt der Git-Tab die gesamte Gesprächshöhe und das Eingabefeld weicht zurück; Freigaben und Rückfragen bleiben sichtbar.',
1712
+ 'preview.openFile': 'In der Dateivorschau öffnen',
1713
1713
  'preview.title': 'Git-Vorschau',
1714
1714
  'preview.hint': '„Diff anzeigen“ an einer Datei oder einem Commit öffnet den Diff hier in der Seitenleiste.',
1715
1715
  'settings.rail.title': 'Schaltflächen der Aktionsleiste',
@@ -1881,7 +1881,6 @@ window.__ModuleLoader__.load({
1881
1881
  'action.copyHash': 'Copier le numéro de révision',
1882
1882
  'action.details': 'Détails du commit',
1883
1883
  'menu.sendToChat': 'Envoyer dans la conversation',
1884
- 'menu.sendFilePathToChat': 'Envoyer le chemin du fichier dans la conversation',
1885
1884
  'send.commitText': 'commit git {hash} « {subject} » (dépôt {repo})',
1886
1885
  'send.branchText': 'branche git {name} (dépôt {repo})',
1887
1886
  'menu.sendDiffLinesToChat': 'Envoyer les lignes sélectionnées dans la conversation',
@@ -1925,6 +1924,7 @@ window.__ModuleLoader__.load({
1925
1924
  'settings.placement.tabHint': 'Désactivé, le panneau reste accessible depuis la barre latérale droite et le panneau inférieur.',
1926
1925
  'settings.placement.immersive': 'Mode immersif (pleine hauteur, zone de saisie masquée)',
1927
1926
  'settings.placement.immersiveHint': 'Activé, l’onglet Git occupe toute la hauteur de la conversation et la zone de saisie s’efface ; approbations et questions restent visibles.',
1927
+ 'preview.openFile': 'Ouvrir dans l’aperçu du fichier',
1928
1928
  'preview.title': 'Aperçu Git',
1929
1929
  'preview.hint': 'Cliquez sur « Afficher le diff » sur un fichier ou un commit : le diff s’ouvre ici, dans la barre latérale.',
1930
1930
  'settings.rail.title': 'Boutons de la barre d’actions',
@@ -2096,7 +2096,6 @@ window.__ModuleLoader__.load({
2096
2096
  'action.copyHash': 'Скопировать номер ревизии',
2097
2097
  'action.details': 'Сведения о коммите',
2098
2098
  'menu.sendToChat': 'Отправить в чат',
2099
- 'menu.sendFilePathToChat': 'Отправить путь к файлу в чат',
2100
2099
  'send.commitText': 'git-коммит {hash} «{subject}» (репозиторий {repo})',
2101
2100
  'send.branchText': 'git-ветка {name} (репозиторий {repo})',
2102
2101
  'menu.sendDiffLinesToChat': 'Отправить выбранные строки в чат',
@@ -2140,6 +2139,7 @@ window.__ModuleLoader__.load({
2140
2139
  'settings.placement.tabHint': 'В выключенном виде панель доступна из правой боковой панели и нижней панели.',
2141
2140
  'settings.placement.immersive': 'Полноэкранный режим (во всю высоту, без поля ввода)',
2142
2141
  'settings.placement.immersiveHint': 'Во включённом виде вкладка Git занимает всю высоту области диалога, поле ввода скрывается; подтверждения и вопросы остаются на виду.',
2142
+ 'preview.openFile': 'Открыть в предпросмотре файла',
2143
2143
  'preview.title': 'Git-предпросмотр',
2144
2144
  'preview.hint': 'Нажмите «Показать различия» у файла или коммита — различия откроются здесь, в боковой панели.',
2145
2145
  'settings.rail.title': 'Кнопки панели действий',
@@ -2311,7 +2311,6 @@ window.__ModuleLoader__.load({
2311
2311
  'action.copyHash': 'Copiar número da revisão',
2312
2312
  'action.details': 'Detalhes do commit',
2313
2313
  'menu.sendToChat': 'Enviar para a conversa',
2314
- 'menu.sendFilePathToChat': 'Enviar caminho do arquivo para a conversa',
2315
2314
  'send.commitText': 'commit git {hash} "{subject}" (repositório {repo})',
2316
2315
  'send.branchText': 'branch git {name} (repositório {repo})',
2317
2316
  'menu.sendDiffLinesToChat': 'Enviar linhas selecionadas para a conversa',
@@ -2355,6 +2354,7 @@ window.__ModuleLoader__.load({
2355
2354
  'settings.placement.tabHint': 'Desligado, o painel continua disponível na barra lateral direita e no painel inferior.',
2356
2355
  'settings.placement.immersive': 'Modo imersivo (altura total, campo de entrada oculto)',
2357
2356
  'settings.placement.immersiveHint': 'Ativado, a aba Git ocupa toda a altura da conversa e o campo de entrada fica de lado; aprovações e perguntas continuam visíveis.',
2357
+ 'preview.openFile': 'Abrir na pré-visualização do arquivo',
2358
2358
  'preview.title': 'Pré-visualização do Git',
2359
2359
  'preview.hint': 'Clique em “Mostrar diff” num arquivo ou commit — o diff abre aqui, na barra lateral.',
2360
2360
  'settings.rail.title': 'Botões da barra de ações',
@@ -2526,7 +2526,6 @@ window.__ModuleLoader__.load({
2526
2526
  'action.copyHash': 'Copia il numero di revisione',
2527
2527
  'action.details': 'Dettagli del commit',
2528
2528
  'menu.sendToChat': 'Invia alla conversazione',
2529
- 'menu.sendFilePathToChat': 'Invia il percorso del file alla conversazione',
2530
2529
  'send.commitText': 'commit git {hash} "{subject}" (repository {repo})',
2531
2530
  'send.branchText': 'branch git {name} (repository {repo})',
2532
2531
  'menu.sendDiffLinesToChat': 'Invia le righe selezionate alla conversazione',
@@ -2570,6 +2569,7 @@ window.__ModuleLoader__.load({
2570
2569
  'settings.placement.tabHint': 'Da spento, il pannello resta raggiungibile dalla barra laterale destra e dal pannello inferiore.',
2571
2570
  'settings.placement.immersive': 'Modalità immersiva (altezza piena, input nascosto)',
2572
2571
  'settings.placement.immersiveHint': 'Attiva, la scheda Git occupa tutta l’altezza della conversazione e la barra di input resta nascosta; approvazioni e domande restano visibili.',
2572
+ 'preview.openFile': 'Apri nell’anteprima del file',
2573
2573
  'preview.title': 'Anteprima Git',
2574
2574
  'preview.hint': 'Fai clic su «Mostra diff» su un file o un commit: il diff si apre qui, nella barra laterale.',
2575
2575
  'settings.rail.title': 'Pulsanti della barra azioni',
@@ -2741,7 +2741,6 @@ window.__ModuleLoader__.load({
2741
2741
  'action.copyHash': 'Revisienummer kopiëren',
2742
2742
  'action.details': 'Commit-details',
2743
2743
  'menu.sendToChat': 'Naar het gesprek verzenden',
2744
- 'menu.sendFilePathToChat': 'Bestandspad naar het gesprek verzenden',
2745
2744
  'send.commitText': 'git-commit {hash} "{subject}" (repository {repo})',
2746
2745
  'send.branchText': 'git-branch {name} (repository {repo})',
2747
2746
  'menu.sendDiffLinesToChat': 'Geselecteerde regels naar het gesprek verzenden',
@@ -2785,6 +2784,7 @@ window.__ModuleLoader__.load({
2785
2784
  'settings.placement.tabHint': 'Uitgeschakeld blijft het paneel bereikbaar via de rechterzijbalk en het onderpaneel.',
2786
2785
  'settings.placement.immersive': 'Meeslepende modus (volledige hoogte, verborgen invoerveld)',
2787
2786
  'settings.placement.immersiveHint': 'Aan: het Git-tabblad vult de hele gespreksruimte en het invoerveld wijkt; goedkeuringen en vragen blijven zichtbaar.',
2787
+ 'preview.openFile': 'Openen in de bestandsvoorbeeld',
2788
2788
  'preview.title': 'Git-voorbeeld',
2789
2789
  'preview.hint': 'Klik op „Diff tonen“ bij een bestand of commit — de diff opent hier in de zijbalk.',
2790
2790
  'settings.rail.title': 'Knoppen van de actiebalk',
@@ -2956,7 +2956,6 @@ window.__ModuleLoader__.load({
2956
2956
  'action.copyHash': 'Kopiuj numer wersji',
2957
2957
  'action.details': 'Szczegóły commita',
2958
2958
  'menu.sendToChat': 'Wyślij do rozmowy',
2959
- 'menu.sendFilePathToChat': 'Wyślij ścieżkę pliku do rozmowy',
2960
2959
  'send.commitText': 'commit git {hash} „{subject}" (repozytorium {repo})',
2961
2960
  'send.branchText': 'gałąź git {name} (repozytorium {repo})',
2962
2961
  'menu.sendDiffLinesToChat': 'Wyślij zaznaczone wiersze do rozmowy',
@@ -3000,6 +2999,7 @@ window.__ModuleLoader__.load({
3000
2999
  'settings.placement.tabHint': 'Po wyłączeniu panel pozostaje dostępny z prawego paska bocznego i dolnego panelu.',
3001
3000
  'settings.placement.immersive': 'Tryb immersyjny (pełna wysokość, ukryte pole wpisywania)',
3002
3001
  'settings.placement.immersiveHint': 'Po włączeniu karta Git wypełnia całą wysokość rozmowy, a pole wpisywania się chowa; zatwierdzenia i pytania pozostają widoczne.',
3002
+ 'preview.openFile': 'Otwórz w podglądzie pliku',
3003
3003
  'preview.title': 'Podgląd Git',
3004
3004
  'preview.hint': 'Kliknij „Pokaż różnice” przy pliku lub commicie — różnice otworzą się tutaj, na pasku bocznym.',
3005
3005
  'settings.rail.title': 'Przyciski paska akcji',
@@ -3171,7 +3171,6 @@ window.__ModuleLoader__.load({
3171
3171
  'action.copyHash': 'Kopiera revisionsnummer',
3172
3172
  'action.details': 'Commit-detaljer',
3173
3173
  'menu.sendToChat': 'Skicka till samtalet',
3174
- 'menu.sendFilePathToChat': 'Skicka filsökvägen till samtalet',
3175
3174
  'send.commitText': 'git-commit {hash} ”{subject}” (arkiv {repo})',
3176
3175
  'send.branchText': 'git-gren {name} (arkiv {repo})',
3177
3176
  'menu.sendDiffLinesToChat': 'Skicka markerade rader till samtalet',
@@ -3215,6 +3214,7 @@ window.__ModuleLoader__.load({
3215
3214
  'settings.placement.tabHint': 'Avstängd finns panelen kvar via höger sidopanel och nedre panelen.',
3216
3215
  'settings.placement.immersive': 'Uppslukande läge (full höjd, dolt inmatningsfält)',
3217
3216
  'settings.placement.immersiveHint': 'På: Git-fliken fyller hela konversationsytan och inmatningsfältet träder åt sidan; godkännanden och frågor visas fortfarande.',
3217
+ 'preview.openFile': 'Öppna i filförhandsvisningen',
3218
3218
  'preview.title': 'Git-förhandsvisning',
3219
3219
  'preview.hint': 'Klicka på ”Visa diff” på en fil eller en commit — diffen öppnas här i sidopanelen.',
3220
3220
  'settings.rail.title': 'Knappar i åtgärdsfältet',
@@ -3386,7 +3386,6 @@ window.__ModuleLoader__.load({
3386
3386
  'action.copyHash': 'Revizyon numarasını kopyala',
3387
3387
  'action.details': 'Commit ayrıntıları',
3388
3388
  'menu.sendToChat': 'Sohbete gönder',
3389
- 'menu.sendFilePathToChat': 'Dosya yolunu sohbete gönder',
3390
3389
  'send.commitText': 'git commit {hash} "{subject}" (depo {repo})',
3391
3390
  'send.branchText': 'git dalı {name} (depo {repo})',
3392
3391
  'menu.sendDiffLinesToChat': 'Seçili satırları sohbete gönder',
@@ -3430,6 +3429,7 @@ window.__ModuleLoader__.load({
3430
3429
  'settings.placement.tabHint': 'Kapatıldığında panel sağ kenar çubuğundan ve alt panelden açılabilir.',
3431
3430
  'settings.placement.immersive': 'Odaklanma modu (tam yükseklik, gizli giriş alanı)',
3432
3431
  'settings.placement.immersiveHint': 'Açıkken Git sekmesi tüm konuşma alanını kaplar ve giriş alanı gizlenir; onaylar ve sorular yine de görünür.',
3432
+ 'preview.openFile': 'Dosya önizlemesinde aç',
3433
3433
  'preview.title': 'Git Önizlemesi',
3434
3434
  'preview.hint': 'Bir dosya veya commit üzerinde „Farkı göster”e tıklayın — fark burada, kenar çubuğunda açılır.',
3435
3435
  'settings.rail.title': 'Eylem çubuğu düğmeleri',
@@ -3601,7 +3601,6 @@ window.__ModuleLoader__.load({
3601
3601
  'action.copyHash': 'Salin nomor revisi',
3602
3602
  'action.details': 'Detail commit',
3603
3603
  'menu.sendToChat': 'Kirim ke obrolan',
3604
- 'menu.sendFilePathToChat': 'Kirim jalur berkas ke obrolan',
3605
3604
  'send.commitText': 'commit git {hash} "{subject}" (repositori {repo})',
3606
3605
  'send.branchText': 'cabang git {name} (repositori {repo})',
3607
3606
  'menu.sendDiffLinesToChat': 'Kirim baris terpilih ke obrolan',
@@ -3645,6 +3644,7 @@ window.__ModuleLoader__.load({
3645
3644
  'settings.placement.tabHint': 'Dimatikan, panel tetap bisa dibuka dari bilah sisi kanan dan panel bawah.',
3646
3645
  'settings.placement.immersive': 'Mode imersif (tinggi penuh, kolom masukan tersembunyi)',
3647
3646
  'settings.placement.immersiveHint': 'Aktif: tab Git memenuhi seluruh tinggi area percakapan dan kolom masukan mengalah; persetujuan dan pertanyaan tetap tampil.',
3647
+ 'preview.openFile': 'Buka di pratinjau berkas',
3648
3648
  'preview.title': 'Pratinjau Git',
3649
3649
  'preview.hint': 'Klik “Tampilkan diff” pada file atau commit — diff terbuka di sini, di bilah sisi.',
3650
3650
  'settings.rail.title': 'Tombol bilah aksi',
@@ -3816,7 +3816,6 @@ window.__ModuleLoader__.load({
3816
3816
  'action.copyHash': 'Sao chép số hiệu bản sửa',
3817
3817
  'action.details': 'Chi tiết commit',
3818
3818
  'menu.sendToChat': 'Gửi vào hội thoại',
3819
- 'menu.sendFilePathToChat': 'Gửi đường dẫn tệp vào hội thoại',
3820
3819
  'send.commitText': 'git commit {hash} "{subject}" (kho {repo})',
3821
3820
  'send.branchText': 'nhánh git {name} (kho {repo})',
3822
3821
  'menu.sendDiffLinesToChat': 'Gửi các dòng đã chọn vào hội thoại',
@@ -3860,6 +3859,7 @@ window.__ModuleLoader__.load({
3860
3859
  'settings.placement.tabHint': 'Tắt rồi, bảng vẫn mở được từ thanh bên phải và bảng dưới.',
3861
3860
  'settings.placement.immersive': 'Chế độ đắm chìm (chiều cao đầy đủ, ẩn ô nhập)',
3862
3861
  'settings.placement.immersiveHint': 'Bật: thẻ Git chiếm toàn bộ chiều cao vùng hội thoại và ô nhập thu vào; phê duyệt và câu hỏi vẫn hiển thị bình thường.',
3862
+ 'preview.openFile': 'Mở trong xem trước tệp',
3863
3863
  'preview.title': 'Xem trước Git',
3864
3864
  'preview.hint': 'Bấm “Xem diff” trên tệp hoặc commit — diff sẽ mở ở đây, trên thanh bên.',
3865
3865
  'settings.rail.title': 'Nút thanh tác vụ',
@@ -4031,7 +4031,6 @@ window.__ModuleLoader__.load({
4031
4031
  'action.copyHash': 'نسخ رقم المراجعة',
4032
4032
  'action.details': 'تفاصيل الالتزام',
4033
4033
  'menu.sendToChat': 'إرسال إلى المحادثة',
4034
- 'menu.sendFilePathToChat': 'إرسال مسار الملف إلى المحادثة',
4035
4034
  'send.commitText': 'التزام git {hash} "{subject}" (المستودع {repo})',
4036
4035
  'send.branchText': 'فرع git {name} (المستودع {repo})',
4037
4036
  'menu.sendDiffLinesToChat': 'إرسال الأسطر المحددة إلى المحادثة',
@@ -4075,6 +4074,7 @@ window.__ModuleLoader__.load({
4075
4074
  'settings.placement.tabHint': 'عند الإيقاف تبقى اللوحة متاحة من الشريط الجانبي الأيمن واللوحة السفلية.',
4076
4075
  'settings.placement.immersive': 'الوضع الغامر (ارتفاع كامل، إخفاء صندوق الكتابة)',
4077
4076
  'settings.placement.immersiveHint': 'عند التشغيل يملأ تبويب Git منطقة المحادثة بكامل ارتفاعها ويتراجع صندوق الكتابة؛ تظل الموافقات والأسئلة ظاهرة كالمعتاد.',
4077
+ 'preview.openFile': 'افتح في معاينة الملف',
4078
4078
  'preview.title': 'معاينة Git',
4079
4079
  'preview.hint': 'انقر «عرض الفروق» على ملف أو commit — تُفتح الفروق هنا في الشريط الجانبي.',
4080
4080
  'settings.rail.title': 'أزرار شريط الإجراءات',
@@ -4246,7 +4246,6 @@ window.__ModuleLoader__.load({
4246
4246
  'action.copyHash': 'रिवीज़न संख्या कॉपी करें',
4247
4247
  'action.details': 'कमिट विवरण',
4248
4248
  'menu.sendToChat': 'बातचीत में भेजें',
4249
- 'menu.sendFilePathToChat': 'फ़ाइल पथ बातचीत में भेजें',
4250
4249
  'send.commitText': 'git कमिट {hash} "{subject}" (रिपॉज़िटरी {repo})',
4251
4250
  'send.branchText': 'git ब्रांच {name} (रिपॉज़िटरी {repo})',
4252
4251
  'menu.sendDiffLinesToChat': 'चयनित पंक्तियाँ बातचीत में भेजें',
@@ -4290,6 +4289,7 @@ window.__ModuleLoader__.load({
4290
4289
  'settings.placement.tabHint': 'बंद करने पर भी पैनल दाएँ साइडबार और निचले पैनल से खुलता है।',
4291
4290
  'settings.placement.immersive': 'इमर्सिव मोड (पूरी ऊँचाई, छिपा इनपुट बॉक्स)',
4292
4291
  'settings.placement.immersiveHint': 'चालू होने पर Git टैब पूरे संवाद क्षेत्र की ऊँचाई घेर लेता है और इनपुट बॉक्स हट जाता है; अनुमोदन और प्रश्न फिर भी दिखते हैं।',
4292
+ 'preview.openFile': 'फ़ाइल पूर्वावलोकन में खोलें',
4293
4293
  'preview.title': 'Git पूर्वावलोकन',
4294
4294
  'preview.hint': 'फ़ाइल या कमिट पर “अंतर दिखाएँ” पर क्लिक करें — अंतर यहीं साइडबार में खुलेगा।',
4295
4295
  'settings.rail.title': 'एक्शन रेल बटन',
@@ -4461,7 +4461,6 @@ window.__ModuleLoader__.load({
4461
4461
  'action.copyHash': 'คัดลอกเลขรีวิชัน',
4462
4462
  'action.details': 'รายละเอียดคอมมิต',
4463
4463
  'menu.sendToChat': 'ส่งไปยังบทสนทนา',
4464
- 'menu.sendFilePathToChat': 'ส่งพาธไฟล์ไปยังบทสนทนา',
4465
4464
  'send.commitText': 'git คอมมิต {hash} "{subject}" (รีโพซิทอรี {repo})',
4466
4465
  'send.branchText': 'git บรานช์ {name} (รีโพซิทอรี {repo})',
4467
4466
  'menu.sendDiffLinesToChat': 'ส่งบรรทัดที่เลือกไปยังบทสนทนา',
@@ -4505,6 +4504,7 @@ window.__ModuleLoader__.load({
4505
4504
  'settings.placement.tabHint': 'ปิดแล้วยังเปิดแผงจากแถบข้างขวาหรือแผงล่างได้',
4506
4505
  'settings.placement.immersive': 'โหมดดื่มด่ำ (เต็มความสูง, ซ่อนกล่องพิมพ์)',
4507
4506
  'settings.placement.immersiveHint': 'เมื่อเปิด แท็บ Git จะกินพื้นที่สูงทั้งหมดของบทสนทนาและกล่องพิมพ์จะถอยออก; การอนุมัติและคำถามยังแสดงตามปกติ',
4507
+ 'preview.openFile': 'เปิดในตัวอย่างไฟล์',
4508
4508
  'preview.title': 'ดูตัวอย่าง Git',
4509
4509
  'preview.hint': 'คลิก “แสดงความต่าง” ที่ไฟล์หรือคอมมิต — ความต่างจะเปิดที่นี่ในแถบข้าง',
4510
4510
  'settings.rail.title': 'ปุ่มแถบการทำงาน',
@@ -6200,7 +6200,10 @@ window.__ModuleLoader__.load({
6200
6200
  /* Host-rendered first (v0.14): the ui-primitives diff card brings the
6201
6201
  shared toolbar (copy / wrap / language) and the product's diff colors.
6202
6202
  A patch we cannot replay into a hunk (binary, mode-only) or a host
6203
- without the seed module falls back to the hand-drawn rows below. */
6203
+ without the seed module falls back to the hand-drawn rows below. This
6204
+ IS the official diff renderer (the platform seed table ships it, the
6205
+ host's own surfaces render diffs through it) — the external preview
6206
+ tab uses the same one, so every diff in the product reads alike. */
6204
6207
  if (UIPrimitives !== null && typeof UIPrimitives.DiffBlock === 'function') {
6205
6208
  const hunk = patchToHunk(props.patch)
6206
6209
  if (hunk !== null) {
@@ -6274,6 +6277,7 @@ window.__ModuleLoader__.load({
6274
6277
  grip: ['M5.6 4.6h4.8', 'M5.6 8h4.8', 'M5.6 11.4h4.8'],
6275
6278
  filter: ['M2 3.6h12l-4.6 5.2v4.2l-2.8-1.4V8.8z'],
6276
6279
  check: ['M3.2 8.4 6.4 11.6 12.8 4.6'],
6280
+ copy: ['M5.5 5.5h8v8h-8z', 'M10.5 5.5v-3h-8v8h3'],
6277
6281
  // dock actions (official right sidebar): lift a panel out, drop it back into
6278
6282
  // the dock, split the pane, and the full-screen pair reuses expand/collapse.
6279
6283
  float: ['M2.5 6.5v7h7v-3', 'M6 10 13.2 2.8', 'M9.4 2.8h3.8v3.8'],
@@ -8246,8 +8250,8 @@ window.__ModuleLoader__.load({
8246
8250
  try {
8247
8251
  const scopeObject = scope || {}
8248
8252
  previewStore.set(commitHash !== null
8249
- ? { hash: commitHash, subject: seed.subject || '', cwd: scopeObject.cwd, repoRoot: repoRoot }
8250
- : { path: seed.path, staged: seed.staged === true, cwd: scopeObject.cwd, repoRoot: repoRoot })
8253
+ ? { hash: commitHash, subject: seed.subject || '', cwd: scopeObject.cwd, repoRoot: repoRoot, sessionId: scopeObject.sessionId }
8254
+ : { path: seed.path, staged: seed.staged === true, cwd: scopeObject.cwd, repoRoot: repoRoot, sessionId: scopeObject.sessionId })
8251
8255
  sidebarRight.openTab(NATIVE_PREVIEW_KIND)
8252
8256
  return true
8253
8257
  } catch (error) { void error }
@@ -8483,7 +8487,6 @@ window.__ModuleLoader__.load({
8483
8487
  const items = [
8484
8488
  { id: 'diff', icon: 'file', tone: 'primary', label: t('action.showDiff'), run: () => { showDiff({ path: item.path, staged: group === 'staged', untracked: group === 'untracked' }) } },
8485
8489
  { id: 'sendRef', icon: 'send', tone: 'accent', label: t('menu.sendToChat'), run: () => sendFileReferenceToChat(item.path) },
8486
- { id: 'sendPath', icon: 'file', tone: 'secondary', label: t('menu.sendFilePathToChat'), run: () => sendToComposer({ text: item.path, fallback: item.path }) },
8487
8490
  null,
8488
8491
  group === 'staged'
8489
8492
  ? { id: 'unstage', icon: 'minus', tone: 'warn', label: t('action.unstage'), run: () => { void run('unstage', { paths: [item.path] }) } }
@@ -8509,7 +8512,6 @@ window.__ModuleLoader__.load({
8509
8512
  } },
8510
8513
  null,
8511
8514
  { id: 'sendRef', icon: 'send', tone: 'accent', label: t('menu.sendToChat'), run: () => sendFileReferenceToChat(file.path) },
8512
- { id: 'sendPath', icon: 'file', tone: 'secondary', label: t('menu.sendFilePathToChat'), run: () => sendToComposer({ text: file.path, fallback: file.path }) },
8513
8515
  null,
8514
8516
  { id: 'copy', icon: 'tag', tone: 'secondary', label: t('action.copyPath'), run: () => { copyText(file.path) } },
8515
8517
  ])
@@ -9523,6 +9525,9 @@ window.__ModuleLoader__.load({
9523
9525
  '.dig-preview-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',
9524
9526
  '.dig-preview-body{flex:1;min-height:0;overflow:auto;padding:8px 12px;display:flex;flex-direction:column}',
9525
9527
  '.dig-preview-body .dig-diff-host,.dig-preview-body .dig-diff{flex:1;min-height:0}',
9528
+ '.dig-preview-actions{display:flex;align-items:center;gap:4px;flex:none}',
9529
+ '.dig-preview-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}',
9530
+ '.dig-preview-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}',
9526
9531
  ].join('\n')
9527
9532
 
9528
9533
  /* ============================== plugin ============================== */
@@ -9829,6 +9834,10 @@ window.__ModuleLoader__.load({
9829
9834
  ? ''
9830
9835
  : (seed.hash !== undefined && seed.hash !== null ? 'c:' + String(seed.hash) : 'w:' + String(seed.staged === true) + ':' + String(seed.path))
9831
9836
  const [state, setState] = useState({ loading: false, patch: '', error: null })
9837
+ const [refreshTick, setRefreshTick] = useState(0)
9838
+ const [copied, setCopied] = useState(false)
9839
+ const copyTimer = useRef(null)
9840
+ useEffect(() => () => { if (copyTimer.current !== null) clearTimeout(copyTimer.current) }, [])
9832
9841
  useEffect(() => {
9833
9842
  if (seed === null) return undefined
9834
9843
  let alive = true
@@ -9847,15 +9856,54 @@ window.__ModuleLoader__.load({
9847
9856
  })()
9848
9857
  return () => { alive = false }
9849
9858
  // eslint-disable-next-line react-hooks/exhaustive-deps
9850
- }, [seedKey])
9859
+ }, [seedKey, refreshTick])
9851
9860
  const title = seed === null
9852
9861
  ? ''
9853
9862
  : (seed.hash !== undefined && seed.hash !== null
9854
9863
  ? String(seed.hash).slice(0, 7) + (seed.subject ? ' ' + seed.subject : '')
9855
9864
  : String(seed.path))
9865
+ /* Header controls mirror the base's own diff tab: a refresh button
9866
+ (worktree diffs change under staging/discard), plus a copy button —
9867
+ the official card's toolbar already covers wrap/copy inside the body;
9868
+ these two act on the WHOLE preview. */
9869
+ const copyPatch = () => {
9870
+ try {
9871
+ void navigator.clipboard.writeText(state.patch).then(() => {
9872
+ setCopied(true)
9873
+ if (copyTimer.current !== null) clearTimeout(copyTimer.current)
9874
+ copyTimer.current = setTimeout(() => { setCopied(false); copyTimer.current = null }, 1600)
9875
+ })
9876
+ } catch (error) { void error }
9877
+ }
9878
+ /* Hand the file to the HOST'S own file preview (ReadBlock chrome: path
9879
+ banner, line numbers, syntax colors) — the official openResource
9880
+ channel, the same one every @-mention file click rides. The diff stays
9881
+ the place to read the CHANGE; this jumps to the whole file with the
9882
+ product's line-numbered reader. Address grammar (workspace-path):
9883
+ `dsh-resource://file/session/<sessionId>/<per-segment encoded rel>`. */
9884
+ const openInFilePreview = () => {
9885
+ if (seed === null || seed.path === undefined || seed.path === null || seed.path === '') return
9886
+ let sidebarRight = undefined
9887
+ try { sidebarRight = props.ctx === undefined || props.ctx === null ? undefined : props.ctx.get('sidebarRight') } catch (error) { void error }
9888
+ if (sidebarRight === undefined || sidebarRight === null || typeof sidebarRight.openResource !== 'function') return
9889
+ try {
9890
+ const relative = String(seed.path)
9891
+ const address = 'dsh-resource://file/session/' + encodeURIComponent(String(seed.sessionId || '')) + '/' + relative.split('/').map((segment) => encodeURIComponent(segment)).join('/')
9892
+ sidebarRight.openResource(address)
9893
+ } catch (error) { void error }
9894
+ }
9856
9895
  return E('div', { className: 'dig-preview-root' },
9857
9896
  E('div', { className: 'dig-preview-head' },
9858
- E('span', { className: 'dig-preview-title', title: title }, title === '' ? t('preview.title') : title)),
9897
+ E('span', { className: 'dig-preview-title', title: title }, title === '' ? t('preview.title') : title),
9898
+ seed === null ? null : E('div', { className: 'dig-preview-actions' },
9899
+ seed.path !== undefined && seed.path !== null && seed.path !== ''
9900
+ ? E('button', { type: 'button', className: 'dig-preview-btn', 'aria-label': t('preview.openFile'), title: t('preview.openFile'), onClick: openInFilePreview },
9901
+ E(Icon, { name: 'file', size: 13 }))
9902
+ : null,
9903
+ E('button', { type: 'button', className: 'dig-preview-btn', 'aria-label': t('diff.copy'), title: t('diff.copy'), onClick: copyPatch },
9904
+ E(Icon, { name: copied === true ? 'check' : 'copy', size: 13 })),
9905
+ E('button', { type: 'button', className: 'dig-preview-btn', 'aria-label': t('toolbar.refresh'), title: t('toolbar.refresh'), onClick: () => { setRefreshTick((n) => n + 1) } },
9906
+ E(Icon, { name: 'refresh', size: 13 })))),
9859
9907
  seed === null
9860
9908
  ? E('div', { className: 'dig-preview-body' }, E('div', { className: 'dig-empty' }, t('preview.hint')))
9861
9909
  : state.error !== null