dsh-composer-plus 1.23.0 → 1.24.0

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/README.tr.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz; bu profili uygulama yönetir.)
31
31
 
32
- > dsh’nin pnpm’i, yayımlanmasının üzerinden 24 saat geçmemiş sürümleri atlar. Bir yayından hemen sonra sürümü ekleyin: `dsh-composer-plus@1.23.0`.
32
+ > dsh’nin pnpm’i, yayımlanmasının üzerinden 24 saat geçmemiş sürümleri atlar. Bir yayından hemen sonra sürümü ekleyin: `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## Özellikler
35
35
 
@@ -75,6 +75,7 @@ Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz;
75
75
  | **Korunan dosyalar** | <a id="feature-protectedfiles"></a>Varsayılan olarak açık. Ajanın kendi dosya araçları, desenlerinizle eşleşen dosyaları okuyamaz ve değiştiremez: **okuma ve yazma** desenlerinde bir dosya üzerindeki `read`, `read_image` ve `grep` reddedilir; her iki türde de `write`, `edit` ve `str_replace_editor` reddedilir. Ajan nedenini okur ve size sorması söylenir. Varsayılan desenler `.env*`, `*.pem` ve `*.key`. Ayarlar → Composer Plus → **Korunan dosyalar**: bir desen ekleyin (örneğin `published/**` ya da `config/*.yml`), türüne tıklayarak **okuma ve yazma** ile **yalnızca yazma** arasında geçin, ✕ ile kaldırın ya da **Varsayılanları kullan**. `/` içermeyen bir desen, her klasördeki dosya adıyla eşleşir. Bu bir korkuluktur, korumalı alan değildir: bir kabuk komutu (`cat .env`), bir betik ya da bir MCP aracı dosyaya yine erişebilir (bkz. Sınırlar). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ekran görüntüsü: Korunan dosyalar"></a> |
76
76
  | **Engellenen komutlar** | <a id="feature-blockedcommands"></a>Varsayılan olarak açık, liste başta boştur. Ajanın kabuk komutları (`bash`, `pwsh`) kurallarınızla eşleşen bir komutu çalıştıramaz: bir **engelle** kuralı çağrıyı reddeder (ajan nedenini okur ve size sorması söylenir), bir **önce sor** kuralı dsh’nin onay kartını gösterir ve komut yalnızca siz izin verince çalışır. Ayarlar → Composer Plus → **Engellenen komutlar**: bir kural yazın (örneğin `npm publish`, `git push --force` ya da `ssh *192.168.2.19`), türüne tıklayarak **engelle** ile **önce sor** arasında geçin, sonra **Ekle** düğmesine tıklayın; bir kuralın türünü değiştirmek için türüne tıklayın, kuralı ✕ ile kaldırın. Bir kural, bir komut adı ve ondan sonra bu sırayla gelmesi gereken sözcüklerdir; `*` herhangi bir metinle eşleşir. Kontrol, komutu `&&`, `;`, `\|` sonrasında, `$(…)`, `bash -c "…"` ya da `eval` içinde ve `sudo` ya da `env` sonrasında da bulur. Bu bir korkuluktur, korumalı alan değildir: bir değişken (`$CMD`), bir betik dosyası ya da başka bir program komutu yine çalıştırabilir (bkz. Sınırlar). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ekran görüntüsü: Engellenen komutlar"></a> |
77
77
  | **Görev panosu** | <a id="feature-taskboard"></a>Sol kenar çubuğu → **Görev panosu** ya da dsh’nin her yerinde `Cmd+Shift+K` (Windows ve Linux’ta `Ctrl+Shift+K`). Kenar çubuğunun gösterdiği canlı durumla dsh sohbetlerinizin kanban panosu: onayınızı, yanıtınızı ya da plan incelemenizi bekleyen sohbet turuncu bir noktayla **İncelemede** sütunundadır, çalışan sohbet **Yapılıyor** sütunundadır, henüz açmadığınız biten sohbet **Bitti** sütunundadır (yeşil). Bir sohbeti açınca kartı **Bitti** sütunundan kendiliğinden çıkar; okuduğunuz biten sohbetleri görmek için yeşil kartların altındaki **Son bitenler (N)** satırına tıklayın (en yeni 10 tanesi, sonra **Daha eski N görevi göster**; açık ya da kapalı olması bu cihazda kalır). Panonun arkasında açıkken biten sohbet (**Yeni görev**) siz açana kadar yeşil kalır. Proje listesini açmak için panonun üstündeki proje adına tıklayın, sonra bir proje ya da **Tüm projeler** seçin; “Sohbet başına dal” klasörü kendi projesinden sayılır. Liste seçimden sonra, `Esc` ile ya da dışına tıklayınca kapanır. Bir projeyi adıyla bulmak için listenin en üstündeki **Projelerde ara** kutusuna yazın (büyük/küçük harf ve aksanlar fark etmez; `Esc` kutuyu boşaltır), ilk eşleşmeyi seçmek için `Enter` tuşuna basın ve yalnız bekleyen, çalışan, görülmeden biten ya da son 2 saatte değişen bir sohbeti olan projeleri göstermek için **Son 2 saatte aktif olanlar** seçeneğine tıklayın (bu seçim bu cihazda saklanır). **Yeni görev** (ya da `n`), panonun gösterdiği projede dsh’nin kendi yeni sohbetini açar (**Tüm projeler** seçiliyken dsh’nin Yeni oturum düğmesinin seçtiği projede); böylece her sohbette olduğu gibi dosya ekleyebilir, komut kullanabilir ve modeli seçebilirsiniz. İlk mesajınız gidince pano kendiliğinden geri gelir. O zamana kadar sohbet **Yapılıyor** sütununun en üstünde **Yeni görev** olarak bekler: ilk mesajı yazmak için ona tıklayın. Sizi bekleyen bir sohbeti olan projenin yanında, proje listesinde turuncu bir nokta görünür (herhangi bir sohbet beklerken üstteki proje adında da görünür). Sohbete dsh ad verir ve sohbetin modeli o mesajdan en çok 3 etiket yazar. Sohbetini açmak için bir karta tıklayın. Turuncu bir kartı panoda yanıtlamak için karta (ya da **Yanıtla** düğmesine) tıklayın; sohbetin tamamı için paneldeki **Sohbeti aç** düğmesini kullanın: **Reddet** ya da **Bir kez izin ver**, plan için **Onayla** ya da **Değişiklik iste**, soru için seçenekler ve kendi metniniz. Bir kartı panodan kaldırmak için biten karttaki **×** düğmesine tıklayın; **Son bitenler** açıkken bu kartları panodan kaldırmak için **Bitti** sütununun üstündeki **Tümünü temizle** düğmesine tıklayın: önce hangi projeden kaç kartın kalkacağını gösterir, okunmamış (yeşil) kartlar kalır. Sonraki 8 saniye içinde **Geri al** kartları geri getirir; **Bitti** sütununun altındaki **Kaldırılanlar (N)** panodan kalkan kartları listeler, **Panoya geri koy** bir kartı yeniden **Bitti** sütununda gösterir. Hiçbir sohbet silinmez: sohbetler dsh’nin kenar çubuğunda kalır, pano bunu yeniden başlatmadan sonra da hatırlar (Tether aynı panoyu gösterir) ve yeniden çalışan bir sohbet panoya geri gelir. İlerlemesini görmek için **Yapılıyor** sütunundaki bir kartın üzerine gelin (ya da klavye odağını karta taşıyın): sohbetin ne kadar süredir çalıştığı, yapılacaklar listesindeki adımı, şu an çalışan araç ve ajanın son satırı. Ayarlar → Composer Plus → Görev panosu bölümünde **Üzerine gelince ilerleme** ile **Hızlı (AI’sız)** (varsayılan: yalnız sohbeti okur) ya da **AI özeti** (sohbetin modeline yapılan kısa bir çağrı bir iki cümle de yazar) seçilir. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ekran görüntüsü: Görev panosu"></a> |
78
+ | **Asistan** | <a id="feature-assistant"></a>Varsayılan olarak kapalıdır: **Ayarlar → Composer Plus** içinden açın. Sonra sol kenar çubuğunda **Asistan**'a tıklayın (**Görev panosu**'nun hemen altında): ChatGPT ya da Grok sohbeti gibi kişisel asistanınız olarak kullandığınız tek ve kalıcı bir sohbet açılır. İlk tıklama `~/Assistant` klasörünü oluşturur, onu "Assistant" projesi olarak ekler ve sohbeti workspace-write izin modu ve dsh'nin varsayılan modeliyle başlatır. Sonraki her tıklama aynı sohbeti açar (arşivlenmiş sohbet geri gelir, silinmiş sohbet yeniden oluşur). Ondan hatırlatma isteyin ("2 dakika sonra bana su içmemi hatırlat"): dsh'nin zamanlanmış görevlerini kullanır, bu yüzden hatırlatma zamanı gelince sohbet çalışır ve Mobile connect açıksa Tether "Turn finished" bildirimini gönderir. Web'de araştırma isteyin ya da öteki sohbetlerinizi sorun: tüm projelerin sohbetlerini (çalışıyor, sizi bekliyor ya da boşta) listeleyebilir ve bir sohbetin son mesajlarını okuyabilir. Bir sohbete mesaj da gönderebilir, bir projede yeni sohbet açabilir, çalışan bir sohbeti durdurabilir ya da bir sohbeti arşivleyebilir: bu dört işlemin her biri önce dsh'nin onay kartını açar (Tether'da da), **Bir kez izin ver**'e tıklamadan hiçbir şey olmaz. Silme aracı yoktur. Bu araçlar ve kısa talimatlar yalnız bu sohbettedir. Bir web sayfasında ya da başka bir sohbette okuduğu metin emir değil, veri sayılır. Profilinizi her seferinde anlatmak yerine bu projenin hafızasında tutun (**Proje hafızası**, "profil" konusu). | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Ekran görüntüsü: Asistan"></a> |
78
79
  | **Proje hafızası** | <a id="feature-projectmemory"></a>Varsayılan olarak kapalıdır: **Ayarlar → Composer Plus** içinden açın. Her proje klasörünün kendi hafızası olur ve o projenin sonraki sohbetleri bu hafızayı okur. DS Bot da her Bot için böyle bir hafıza tutar. Her tur bittikten sonra sohbetin modeline bir çağrı yapılır: yeni mesajları okur (geri alınanları okumaz), kalıcı tercihlerinizi, kararlarınızı ve olguları kısa notlar olarak saklar, eski notları değiştirir ya da siler. Ajan da notları kendisi kaydedebilir, silebilir ve arayabilir (`memory_remember`, `memory_forget`, `memory_recall`). Bir not genel de olabilir: o notu her proje okur. Yeni bir sohbet notları sistem isteminde alır; sonra kaydedilen bir not bir sonraki sohbette görünür. Dosyalar dsh ana klasöründe Markdown dosyalarıdır (`storages/dsh-composer-plus/memory/`), hiçbir zaman proje klasöründe değildir. Aynı satırdaki **Hafızayı aç**, kaydedilen tüm notları proje proje (ve genel hafızayı) gösterir; notları filtreleyebilirsiniz. Neyin değişeceğini kendi sözlerinizle yazın (örneğin "yarn yerine artık pnpm kullanıyorum"), sonra **Değişiklikleri önizle**: değişiklikleri dsh’nin varsayılan modeli önerir, yalnız **Uygula** onları kaydeder. Tether’de: sohbet başlığı menüsü → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ekran görüntüsü: Proje hafızası"></a> |
79
80
  | **Hafıza sürüm geçmişi** | <a id="feature-memoryhistory"></a>**Proje hafızası** açıkken varsayılan olarak açıktır. Hafızaya yapılan her kayıttan önce (ajan, tur sonrası gözden geçirme, **Hafızayı aç**) notların o anki bir kopyası tutulur. **Hafızayı aç** içinde bir proje ya da **Genel hafıza** seçin, sonra **Geçmiş**: sürümler tarihe göre ve her birinden sonra hafızayı kimin değiştirdiğiyle listelenir. Bir sürüm seçince geri yüklemenin neyi değiştireceğini diff olarak görürsünüz, sonra **Geri yükle**. Geri yüklemeden önceki notlar da tutulur, bu yüzden geri yüklemeyi geri alabilirsiniz. Her hafızanın en yeni 50 sürümü kalır. Tether'da: sohbet başlığı menüsü → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Ekran görüntüsü: Hafıza sürüm geçmişi"></a> |
80
81
  | **Hafızayı AGENTS.md dosyasına aktar** | <a id="feature-memoryexport"></a>**Hafızayı aç** içinde bir proje seçin, sonra **AGENTS.md dosyasına aktar**: o projenin notları klasöründeki `AGENTS.md` dosyasında işaretli bir bölüme yazılır. Böylece notları commit edip ekibinizle ve başka ajan araçlarıyla paylaşabilirsiniz. Değişikliği önce diff olarak görürsünüz; yalnız **AGENTS.md dosyasını yaz** kaydeder. Sonraki aktarım yalnız bu bölümü değiştirir. Genel hafıza, kaynaklar ve tarihler yazılmaz. Tether'da: sohbet başlığı menüsü → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Ekran görüntüsü: Hafızayı AGENTS.md dosyasına aktar"></a> |
@@ -103,7 +104,7 @@ Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz;
103
104
  | **Seçenek düğmeleri** | <a id="feature-optionpicks"></a>Bir yanıt bir seçenek listesiyle bittiğinde ("Seçenekler" başlığı ya da kalın "Seçenekler" satırı altında 1–9 maddelik numaralı bir liste; "Sonraki adımlar" ve uygulamanın dillerindeki aynı sözcükler de geçerlidir), yanıtın altında her seçenek için bir düğme görünür. Tıklama, seçeneğin tamamıyla birlikte "Option N: …" metnini, siz yazmışsınız gibi mesajınız olarak gönderir. "(önerilen)" ile işaretli seçenek vurgulanır. Düğmeler yalnızca en yeni yanıtın altında, sohbet boştayken ve mesaj kutusu boşken görünür; seçim yapılmış bir yanıtta ve geri alınmış bir yanıtta düğme yoktur. Düğmeler görünürken Sonraki mesaj tahmini tahmin göstermez. Ajanın soru kartında 1–9 tuşları, tıklama gibi o seçeneği seçer (yanıt alanında çalışmaz, soru göründükten sonraki ilk 0,8 saniyede de çalışmaz). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Ekran görüntüsü: Seçenek düğmeleri"></a> |
104
105
  | **Uygulama dili** | <a id="feature-language"></a>Ayarlar → Composer Plus → **Uygulama dili**, dsh arayüzünün tamamını Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt veya हिन्दी diline geçirir (aşağıya bakın). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Ekran görüntüsü: Uygulama dili"></a> |
105
106
  | **Mobil bağlantı (iPhone)** | <a id="feature-mobileconnect"></a>dsh’yi iPhone’unuzdan [Tether](tether/) uygulamasıyla, aynı Wi-Fi ağında ya da [Tailscale](https://tailscale.com) üzerinden kullanın. Özelliği **Ayarlar → Composer Plus** içinden açın (varsayılan olarak kapalıdır, çünkü bu Mac’te bir ağ portu açar). Sonra kenar çubuğunun sol altındaki **Mobil bağlantı** düğmesine tıklayın. QR kodunu iPhone’un Kamera uygulamasıyla (**Open in Tether** düğmesine dokunun) ya da Tether’deki **Scan code** ile tarayın. **Connect** düğmesine dokunun ve **Approve** düğmesine tıklayın. Önce Tether’i yükleyin: Tether yüklü değilse Kamera bu kodu açamaz. Telefon sohbetlerinizi gösterir, mesaj gönderir (fotoğraflarla birlikte: mesaj alanındaki **+** → Camera, Photos ya da Paste image), onayları ve soruları yanıtlar, modelleri ve ajanları değiştirir. İstediğiniz kadar Mac eşleştirebilirsiniz: uygulamanın sol üstündeki Mac adıyla Mac’ler arasında geçiş yaparsınız. **Mobil bağlantı** paneli eşleştirilmiş iPhone’ları son bağlantı zamanlarıyla listeler: **Remove** ile birinin bağlantısını hemen kesersiniz. “Tailscale only” yerel ağı reddeder (paylaşılan bir Wi-Fi için) ve erişim günlüğü kimin bağlanmayı denediğini gösterir. Tether’de “Settings → Privacy” uygulamayı Face ID ile kilitler. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ekran görüntüsü: Mobil bağlantı (iPhone)"></a> |
106
- | **Uzak bilgisayarlar** | <a id="feature-remotecomputers"></a>Diğer Mac’lerinizdeki dsh’yi [Tailscale](https://tailscale.com) üzerinden açın ve bu dsh penceresinde kullanın. Özelliği her Mac’te **Ayarlar → Composer Plus** içinden açın (varsayılan olarak kapalıdır, çünkü ağ portları açar). Açmak istediğiniz Mac’te **Diğer bilgisayarların bu Mac’i açmasına izin ver** seçeneğini açın, **Eşleştirme bağlantısı oluştur** düğmesine tıklayın ve bağlantıyı kopyalayın. Bu Mac’te sol kenar çubuğundaki bilgisayar seçicide (marka adının sağında, **Yeni oturum** düğmesinin üstünde) **Bilgisayar ekle…** seçeneğini seçin, bağlantıyı yapıştırın, bir **Ad** yazın (bu Mac’in ya da başka bir bilgisayarın adı olmamalı) ve **Bağlan** düğmesine tıklayın. Sonra diğer Mac’te **Onayla** düğmesine tıklayın. Bundan sonra seçici **Bu Mac** ile bilgisayarlarınızı listeler: birini seçin, onun dsh’si bu pencereyi kaplar. Orada o bilgisayarın kendi sohbetleri, kenar çubuğu, araçları ve dosyaları vardır. Bu sırada bu Mac arkada çalışmaya devam eder. Diğer Mac aynı seçiciyi aynı yerde gösterir: geri dönmek için orada **Bu Mac** seçeneğini seçin. Ayarlar panelinde bilgisayarları yeniden adlandırabilir ve kaldırabilirsiniz. Panel, bu Mac’i açabilen bilgisayarları da listeler (**Kaldır** birinin bağlantısını hemen keser). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Ekran görüntüsü: Uzak bilgisayarlar"></a> |
107
+ | **Uzak bilgisayarlar** | <a id="feature-remotecomputers"></a>Diğer Mac’lerinizdeki dsh’yi [Tailscale](https://tailscale.com) üzerinden açın ve bu dsh penceresinde kullanın. Özelliği her Mac’te **Ayarlar → Composer Plus** içinden açın (varsayılan olarak kapalıdır, çünkü ağ portları açar). Açmak istediğiniz Mac’te **Diğer bilgisayarların bu Mac’i açmasına izin ver** seçeneğini açın, **Eşleştirme bağlantısı oluştur** düğmesine tıklayın ve bağlantıyı kopyalayın. Bu Mac’te sol kenar çubuğundaki bilgisayar seçicide (marka adının sağında, **Yeni oturum** düğmesinin üstünde) **Bilgisayar ekle…** seçeneğini seçin, bağlantıyı yapıştırın, bir **Ad** yazın (bu Mac’in ya da başka bir bilgisayarın adı olmamalı) ve **Bağlan** düğmesine tıklayın. Sonra diğer Mac’te **Onayla** düğmesine tıklayın. Bundan sonra seçici **Bu Mac** ile bilgisayarlarınızı listeler: birini seçin, onun dsh’si bu pencereyi kaplar. Orada o bilgisayarın kendi sohbetleri, kenar çubuğu, araçları ve dosyaları vardır. Bu sırada bu Mac arkada çalışmaya devam eder. Seçici aynı yerde kalır ve üzerinde **Bu Mac’e dön** yazar: geri dönmek için ona tıklayın. Birden fazla bilgisayarınız varsa tıklama menüyü açar. Orada **Bu Mac** seçeneğini ya da başka bir bilgisayarı seçin. Ayarlar panelinde bilgisayarları yeniden adlandırabilir ve kaldırabilirsiniz. Panel, bu Mac’i açabilen bilgisayarları da listeler (**Kaldır** birinin bağlantısını hemen keser). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Ekran görüntüsü: Uzak bilgisayarlar"></a> |
107
108
  | **Otomatik güncellemeler** | <a id="feature-autoupdate"></a>dsh açıldığında eklenti [en son GitHub sürümünü](https://github.com/furkancak1r/dsh-composer-plus/releases/latest) denetler. Bu sürüm daha yeniyse ve npm’de de varsa, tam olarak o sürümü dsh’nin kendi eklenti yöneticisiyle yükler (Ayarlar → Eklentiler ile aynı yol) ve size bildirir. Yeni sürümü yüklemek için dsh’yi yeniden başlatın. **Ayarlar → Composer Plus → Composer Plus güncellemeleri** sürümü gösterir. **Güncellemeleri denetle** / **Şimdi güncelle** düğmeleri de buradadır. dsh yeni sürümle ilk kez açıldığında **Composer Plus N sürümündeki yenilikler** penceresi o sürümün sürüm notlarını **Uygulama dili** ayarındaki dilde bir kez gösterir (notlar yeni sürümle birlikte gelir, ek ağ çağrısı yapılmaz; notu olmayan bir dilde İngilizce notlar görünür). **Kapat** düğmesi ya da `Esc` pencereyi kapatır. Notların altındaki bir satır GitHub’da yıldız ister; bu satır en çok 30 günde bir görünür (ağ çağrısı yapılmaz). **GitHub’da yıldız ver** ya da **Bir daha sorma** tıklandıktan sonra bir daha görünmez. Pencere, Ayarlar → Eklentiler ya da kopyalanan bir klasörle yapılan güncellemeden sonra da her yeni sürümde bir kez açılır; ilk kurulumda açılmaz. Güncelleme satırındaki **Bu sürümdeki yenilikler** pencereyi yeniden açar. Diskteki sürüm çalışan sürümden yeniyse satır dsh’yi yeniden başlatmanızı söyler. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ekran görüntüsü: Otomatik güncellemeler"></a> |
108
109
  | **Açık/kapalı filtresi** | <a id="feature-featurefilter"></a>**Ayarlar → Composer Plus** içinde **Özellik ara** kutusunun yanında: **Tümü** tüm özellikleri, **Açık** yalnız anahtarı açık olanları, **Kapalı** yalnız anahtarı kapalı olanları gösterir. Her satırın kendi anahtarı belirler; dsh’nin Host’unun tuttuğu anahtarlar da dahildir (örneğin **Mobil bağlantı**). Aramayla birlikte çalışır: bir sözcük yazıp **Kapalı**’yı seçerek kapattığınız bir özelliği bulursunuz. **Açık** ya da **Kapalı** seçiliyken anahtarını değiştirdiğiniz satır, yeniden bir filtre seçene kadar kalır; böylece odak anahtarında kalır. **Açık** ve **Kapalı**, **Uygulama dili** ve **Composer Plus güncellemeleri** satırlarını gizler (anahtarları yoktur). Ayarlar her açılışta **Tümü** ile başlar. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Ekran görüntüsü: Açık/kapalı filtresi"></a> |
109
110
  | **Issue bildir** | <a id="feature-issuereport"></a>Ayarlar → Composer Plus → **Issue bildir…** (giriş metninin altında) ya da kenar çubuğunda bir sohbete sağ tıklayın (ya da sohbetin **…** menüsünü açın) → **Composer Plus için issue bildir…**. Bir tür seçin: **Hata**, **Özellik isteği**, **İyileştirme**, **Çeviri** ya da **Soru**. Kendi sözlerinizle ve kendi dilinizde anlatın, sonra **Taslak yaz** düğmesine tıklayın (ya da `Cmd/Ctrl+Enter`). dsh’nin varsayılan modeline yapılan tek bir çağrı İngilizce bir issue yazar: türün önekiyle bir başlık (örneğin `[Bug]`) ve o türün bölümleri (hata için: What happened, Steps to reproduce, Expected, Actual), ayrıca Composer Plus, dsh ve sistem sürümlerini içeren bir satır. Başlığı ve açıklamayı okuyun ve düzenleyin; **Yeniden yaz** yeni bir taslak yazar. **Issue aç**, issue’yu GitHub CLI (`gh`) oturumunuzla Composer Plus GitHub deposunda açar ve bağlantısını gösterir. Issue herkese açıktır: anahtara ya da parolaya benzeyen metin reddedilir. `gh` issue’yu açamazsa **Bunun yerine GitHub’da aç**, GitHub’ın kendi sayfasını taslakla doldurulmuş olarak açar. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Ekran görüntüsü: Issue bildir"></a> |
@@ -198,6 +199,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
198
199
  - **Yeni sohbette devam et:** siz tıklayana kadar hiçbir şey çalışmaz. Sonra Host tarafı sohbeti (Hedef kontrolü'nün okuduğu gibi: akıl yürütme yok, geri alınan adımlar yok) sohbetin kendi modeline gönderir ve notu gösterir; yalnız **Yeni sohbet başlat** yeni bir sohbet açar. Projeye hiçbir şey yazılmaz.
199
200
  - **Bağlam dökümü:** Host'ta yalnız sohbet günlüğünü okur; model çağrısı yapmaz, proje dosyası okumaz.
200
201
  - **Görev panosu:** pano, bu penceredeki dsh'nin kendi listelerinden dsh'nin kendi sohbetlerini gösterir; kendi sohbet verisi eklemez. **Yeni görev**, dsh'nin kendi yeni sohbetini açar ve ilk mesajı dsh'nin mesaj alanına siz yazarsınız. Bu yüzden onaylar, sandbox ve sohbetin modeli her zamanki gibi uygulanır. Host tarafı o sohbetin ilk mesajını kartın istemi olarak tutar ve onu (ilk 4.000 karakterini, başka hiçbir şeyi) araç olmadan bir istekle daha o sohbetin modeline gönderir ve en çok 3 etiket ister. Her görevin istemi, etiketleri ve başlama zamanı `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` dosyasında tutulur (yalnız sahibinin okuyabildiği dosya, en yeni 2.000 görev). **×** ya da **Tümünü temizle** ile panodan kaldırdığınız sohbetlerin kimlikleri de bu dosyada tutulur (en yeni 5.000 sohbet); anahtar, yanındaki `board-switch.json` dosyasındadır. Hiçbir proje klasörüne bir şey yazılmaz. **Yanıtla**, yanıtınızı dsh'nin kendi bekleyen isteğine, sohbetin kendi kartının yaptığı gibi gönderir. Önceki sürümlerin eski görev listesi (`board.json`) diskte olduğu gibi kalır ve okunmaz. **Üzerine gelince ilerleme**, sohbetin kaydını bu Mac'te okur. **Hızlı (AI’sız)** ile (varsayılan) hiçbir şey gönderilmez. **AI özeti** ile, çalışan bir kartın ilerleme kutusu açıkken (ya da Tether'ın panosu açıkken, en çok 8 çalışan kart için) Host tarafı o sohbetin en yeni kısmını (en çok yaklaşık 6.000 karakter: sizin mesajlarınız, ajanın metin yanıtları, araç çağrıları ve sonuçlarının son kısmı; akıl yürütme ve geri alınan mesajlar yok) araçsız tek bir istekle sohbetin modeline gönderir. Yalnız sohbette yeni bir adım olunca yeniden gönderir; her sohbet için en sık 20 saniyede bir. Not yalnız bellekte tutulur; ayar, `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya).
202
+ - **Asistan:** asistan sohbeti `~/Assistant` içindeki sıradan bir dsh sohbetidir. Model istekleri her sohbetteki gibi dsh'nin varsayılan modeline gider. Araçları bu Mac'teki öteki sohbetlerinizin kayıtlarını okur (başlık, proje, durum ve chat_read ile son mesajlar) ve bunları o modele yalnız model bir araç çağırınca verir. Bir sohbete mesaj göndermek, sohbet açmak, durdurmak ve arşivlemek onayınızı bekler. Sohbet kimliği `$DSH_HOME/storages/dsh-composer-plus/assistant.json` dosyasında, anahtar yanındaki `assistant-switch.json` dosyasında durur (yalnız sahibi okuyabilir). Hatırlatmalar ve otomasyonlar dsh'nin kendi zamanlanmış görevleridir. Sohbetin yaptığı model istekleri ve web aramaları dışında hiçbir şey bu Mac'ten çıkmaz.
201
203
  - **Korunan dosyalar:** liste ve anahtar `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya). Kontrol, her dosya aracı çağrısının yalnız yolunu (ve gerçek yolunu) okur, dosyanın kendisini okumaz.
202
204
  - **Engellenen komutlar:** kurallar ve anahtar `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya). Kontrol, her `bash` ve `pwsh` çağrısının yalnız komut metnini okur; hiçbir şey çalıştırmaz ve hiçbir şey göndermez.
203
205
  - **Gizli değer girişi:** değer karttan (ya da Tether'den, istek gövdelerini loglamayan ağ geçidi üzerinden) Host'a yalnız yanıt isteğinde gider. Host onu `$DSH_HOME/storages/dsh-composer-plus/secrets/<rastgele ad>` dosyasına yazar (klasör 0700, dosya 0600). Değer projeye, sohbet kaydına ya da araç sonucuna yazılmaz. Host, o sohbetin sonraki araç sonuçlarında değerin yerine `[secret]` yazabilmek için değeri bellekte tutar. Dosya ve bu kopya, sohbetin turu bitince ve dsh açılışında silinir. Anahtar yanındaki `secrets.json` dosyasındadır. Ajanın bu dosyayla çalıştırdığı bir komut, değeri o komutun gönderdiği yere gönderebilir; özelliğin amacı da budur.
@@ -224,7 +226,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
224
226
  - **Bir sohbet satırında dal etiketi yok:** kenar çubuğu “Tek listede” görünümünde değil (“Çalışma alanı” ve “Çalışma alanı ağacı” görünümlerinde hiçbir sohbet satırında etiket görünmez), bu sürümü yüklediğinizden beri sohbette hiç tur olmadı, sohbetin klasörü bir git deposu değil ya da **Sohbet satırlarında Git dalı** kapalı. Bir güncellemeden sonra dsh’yi yeniden başlatın (dalı Host tarafı kaydeder).
225
227
  - **Hedef kontrolü, testin 127 koduyla ya da "not found" ile çıktığını söylüyor:** Finder’dan veya Dock’tan başlatılan dsh’nin PATH’i terminalinizdekinden daha kısa olabilir. Bu yüzden dsh `npm`, `pnpm` veya `cargo` aracını bulamaz. dsh’yi bir terminalden başlatın ya da **Hedef kontrolü** → **Düzenle** içinde tam yolu olan kendi test komutunuzu belirleyin. **Şimdi çalıştır** sonucu hemen gösterir.
226
228
  - **Hedef kapanmıyor ve ajan çalışmaya devam ediyor:** **Hedef kontrolü** başarısız bir test ya da eksik bir iş buldu. Hedefin altındaki satır nedenini gösterir (ayrıntılar için imleci sonucun üzerine getirin). Nedeni ya da test komutunu düzeltin veya hedefi `/goal` ya da hedef çubuğuyla kendiniz tamamlayın (bu tamamlama kontrol edilmez).
227
- - **Bir yayından hemen sonra yükleme başarısız oluyor:** sürümü ekleyin (`dsh-composer-plus@1.23.0`) ve yukarıdaki kurulum notuna bakın.
229
+ - **Bir yayından hemen sonra yükleme başarısız oluyor:** sürümü ekleyin (`dsh-composer-plus@1.24.0`) ve yukarıdaki kurulum notuna bakın.
228
230
  - **Şimdi yedekle, "Başka bir yedekleme işlemi sürüyor" diyor:** başka bir dsh penceresinde ya da kurtarma konsolunda bir işlem çalışıyor (ikisi, yedek klasöründeki `.composer-plus.lock` kilit dosyasını paylaşır). İşlemin bitmesini bekleyin. Çalışan bir işlem yoksa, kapanmış bir sürecin kilidi bir sonraki tıklamada devralınır.
229
231
  - **Kurtarma konsolu "dsh is running" diyor:** önce dsh’den çıkın. dsh gerçekten kapalıysa mesajda adı geçen dosya bir çökmeden kalmıştır: dosyayı silin ve yeniden deneyin.
230
232
  - **Geri yüklemeden sonra dsh açılmıyor ya da bir eklenti eksik:** bir profilin eklenti paketlerinin yeniden yüklenmesi gerekir. Kurtarma konsolu bunu geri yüklemeden sonra önerir. Ya da konsolun listelediği, `$DSH_HOME/profiles/` altındaki her klasörde `pnpm install` komutunu çalıştırın. Vault’ta olmayan gizli bilgiler (başka bir bilgisayar) yeniden girilmelidir: konsol bunları listeler.
@@ -258,7 +260,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
258
260
  - **Soru kartını pencereye sığdır** yalnız dsh'nin soru kartını değiştirir, plan inceleme kartını değiştirmez. Kartı dsh'nin işaretlemesiyle bulur (`data-question-key`, `data-question-scroll`). Bir dsh güncellemesi bu işaretlemeyi değiştirirse kart dsh'nin çizdiği gibi görünür. Kartın yüksekliği sohbeti değil pencereyi izler: dar bir yan paneldeki sohbette uzun bir kart sohbetin üstüne taşabilir.
259
261
  - **Sohbet başlığını pencereye sığdır**, dsh'nin sohbet başlığını dsh'nin ürettiği sınıf adlarıyla (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`) bulur, çünkü dsh bunun için bir yerleşim kancası vermez. Bir dsh güncellemesi bu adları değiştirirse başlık dsh'nin çizdiği gibi görünür. Çok dar bir sohbet sütununda başlık iki ya da üç satır kaplayabilir, bu yüzden mesajların üstündeki alan azalır.
260
262
  - **Mobil bağlantı** yalnızca macOS’ta çalışır (`en0`, `openssl`, `swift` ve `dns-sd` kullanır). Sabit 19390 ve 19391 portlarını kullanır. Bu yüzden her Mac’te aynı anda yalnızca bir dsh bu özelliği çalıştırabilir (her Mac, telefonun Mac listesinde bir girdidir). `apns.json` içinde bir APNs anahtarı varsa (bkz. `tether/README.md`), Mac bildirimleri Apple’ın push hizmetiyle gönderir; bildirimler Tether kapalıyken de gelir. Mac uyanık ve dsh açık olmalıdır. Anahtar yoksa telefon yalnızca Tether açıkken ya da arka plana yeni geçmişken bildirim alır. Tether bu bildirimleri yalnızca Tether’de "Settings → Notifications → Send notifications" seçeneğini açtıktan sonra gönderir. Tether bu seçeneği ve saat aralığını eşleşmiş her Mac için ayrı tutar. Seçenek her Mac için varsayılan olarak kapalıdır. iOS bildirim iznini, seçeneği açtığınızda ister. iOS uygulaması henüz App Store’da değildir: uygulamayı Xcode ile `tether/ios` klasöründen derleyin. "Tailscale only" açıkken de Mac’in bir Wi-Fi ya da Ethernet adresi olmalıdır (ağ geçidi yalnızca böyle bir adres varken başlar). Erişim günlüğü her Mac için ayrıdır ve yalnızca en yeni 200 denemeyi tutar. Bir dakika içinde tekrarlanan bir deneme yeni bir satır eklemez, aynı satırın sayısını bir artırır. Her bildirim Mac’i ve sohbetin projesini (`Studio Mac · recipe-box`), sohbet başlığını ve metni gösterir: Turn finished, AI’ın son yanıtını gösterir. APNs anahtarı varsa bu metin Apple’ın push hizmetinden geçer. Tether’in uygulama kilidi, iPhone kilit ekranındaki bildirim önizlemelerini gizlemez: bu önizlemeleri iOS Ayarları’ndan kapatın. Tether’daki yeşil noktalar Mac’i izler: dsh’de açtığınız sohbetin noktası telefonda da gider. Tether’da açtığınız sohbetin noktası yalnızca telefonlarda gider. dsh’nin Mac’teki kendi noktası, sohbeti orada açana kadar kalır.
261
- - **Uzak bilgisayarlar** için iki Mac’te de Tailscale gerekir. Açtığınız Mac’te de Composer Plus olmalı ve bu özellik açık olmalıdır. O Mac uyanık olmalı ve dsh orada çalışıyor olmalıdır. Seçici yalnızca sol kenar çubuğu açıkken görünür (simge sütununda görünmez). Diğer Mac’in sayfasında seçici yalnızca o Mac’te Composer Plus’ın bu sürümü ya da daha yenisi varsa görünür. Daha eski bir sürüm varsa birkaç saniye sonra üstte **Bu Mac’e dön** düğmesi çıkar. Açtığınız her bilgisayarın sayfası, özelliği kapatana ya da dsh’yi yeniden başlatana kadar bellekte kalır. Masaüstü uygulamasında diğer Mac’in sayfası gömülü bir sayfadır: dsh’nin kendi klavye kısayolları (örneğin yeni sohbet) orada çalışmaz. Dosya indirme, mikrofon ve bildirimler de orada çalışmaz. Özellik 19392 numaralı portu kullanır (her Mac’te yalnızca bir dsh diğer bilgisayarların girmesine izin verebilir). Diğer Mac’in sayfasındaki seçici yalnızca bu Mac’in bilgisayarları arasında geçiş yapar. Bu yüzden diğer Mac üzerinden üçüncü bir Mac açamazsınız.
263
+ - **Uzak bilgisayarlar** için iki Mac’te de Tailscale gerekir. Açtığınız Mac’te de Composer Plus olmalı ve bu özellik açık olmalıdır. O Mac uyanık olmalı ve dsh orada çalışıyor olmalıdır. Seçici yalnızca sol kenar çubuğu açıkken görünür (simge sütununda görünmez). Diğer Mac’in sayfasında kendi seçicisi yoksa (orada Composer Plus 1.23.0’dan eskiyse), bu Mac’in seçicisi aynı yerde o sayfanın üstünde görünür. Orada 1.23.0 varsa seçicide o Mac’in adı yazar: geri dönmek için menüsünden **Bu Mac** seçeneğini seçin. Açtığınız her bilgisayarın sayfası, özelliği kapatana ya da dsh’yi yeniden başlatana kadar bellekte kalır. Masaüstü uygulamasında diğer Mac’in sayfası gömülü bir sayfadır: dsh’nin kendi klavye kısayolları (örneğin yeni sohbet) orada çalışmaz. Dosya indirme, mikrofon ve bildirimler de orada çalışmaz. Özellik 19392 numaralı portu kullanır (her Mac’te yalnızca bir dsh diğer bilgisayarların girmesine izin verebilir). Diğer Mac’in sayfasındaki seçici yalnızca bu Mac’in bilgisayarları arasında geçiş yapar. Bu yüzden diğer Mac üzerinden üçüncü bir Mac açamazsınız.
262
264
  - Oturum bağlantısı sohbetlerin içinde çalışır; bağlantıya tıklamak sohbeti açmaz. **Mesaj bağlantısını kopyala** ile alınan bağlantı, mesajını yalnızca dsh 0.2.1 ve sonrasında ve yalnızca bir sohbetteki mesajdan açar (dsh 0.2.0’da kullanıcı metni kuralları yoktur; orada bağlantı kopyalanır ama düz metin olarak görünür). Geri almanın çıkardığı ya da sıkıştırmanın dsh’nin yüklediği geçmişten sildiği bir mesaj gösterilemez: bağlantı bunu söyler. 🔗 düğmeleri dsh’nin mesaj satırlarına bağlanır. Bir dsh güncellemesi bu yapıyı değiştirirse düğmeler görünmez.
263
265
  - **Tümünü okundu işaretle**, dsh’nin kendi okunmamış noktalarını dsh’nin herkese açık API olmayan bir parçasıyla değiştirir (dsh oturum durumundaki `completionUnread` listesi). Bir dsh güncellemesi bunun adını değiştirirse öğe görünmez. Öğe, dsh’nin proje "…" menüsüne eklenir. Bu menüde eklentiler için bir yuva yoktur. dsh bu menüyü değiştirirse öğe yine görünmez.
264
266
  - **Kuyruktaki mesajı yerinde düzenle**, bu arada gönderilmeye başlayan ya da başka bir yerde (örneğin iPhone’daki Tether’de) değişen bir mesajı değiştirmez ve bunu bir uyarıyla bildirir. Yeni görsel için görselleri kabul eden bir model gerekir (dsh’nin kendi görsel sınırları da geçerlidir), yeni dosyanın da yüklemesi bitmeden mesaj kaydedilemez. Yalnızca kendi mesajlarınızı düzenleyebilirsiniz: kuyruktaki bir hedef turu ya da bir soruya verilen yanıt düzenlenemez. Eklenti güncellendikten sonra yalnızca metin değişikliği hemen çalışır: görsel ya da dosya içeren bir mesajı kaydetmeden önce dsh’yi yeniden başlatın (Host tarafı açılışta yüklenir).
@@ -294,6 +296,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
294
296
  - **Türkçe skill paketi** üçüncü taraf bir skill kurar: kuralları Composer Plus’tan değil, yazarın GitHub deposundan gelir; yeni bir sürüm, biz incelemeden bir sonraki günlük denetimden sonra kullanılır. Denetim, dosyaların GitHub’ın o commit için listelediği dosyalar olduğunu kanıtlar; kuralların iyi olduğunu kanıtlamaz. Skill’in ne zaman yükleneceğine model karar verir (siz de adıyla çağırabilirsiniz); kurallar yalnız Türkçe metinlere uygulanır. Host, bir tarayıcının en son bildirdiği dili kullanır: iki tarayıcı farklı diller kullanırsa en yeni bildirim geçerli olur. GitHub, giriş yapılmadan saatte 60 API çağrısına izin verir; reddedilen bir denetim kurulu kopyayı korur ve nedenini Ayarlar’da gösterir.
295
297
  - **Kod tabanını toparla** becerinin sabit bir kopyasıyla gelir (caldoai/skills, commit f3cf477): kaynaktaki bir değişiklik yalnız yeni bir Composer Plus sürümüyle gelir. Beceri, çok dosya değiştirebilen uzun bir hedef çalıştırır; alt ajanları ve kontrolleri çok token harcar. Projenin testi olmayan yerlerde davranışı fark ettirmeden değiştirebilir: ayrı bir dalda başlatın ve birleştirmeden önce farkı okuyun. Projede, özel bir beceri klasöründe ya da `~/.dsh/skills` içinde aynı adlı bir beceri varsa bunun yerine o kullanılır. Anahtar kapalıyken `/untangle-codebase` modele düz metin olarak gider.
296
298
  - **Görev panosu** bu pencerede dsh'nin listelediği sohbetleri gösterir: proje dışındaki bir sohbet yalnız **Tüm projeler** içinde görünür ve “Sohbet başına dal” klasörü (`<project>/.worktrees/<name>`) kendi projesinden sayılır. Bir kartın sütunu sohbetin canlı durumudur, bu yüzden kartlar sürüklenemez: bir sohbet, turu bitince (bir hatadan ya da durdurmadan sonra da) **Bitti** sütununa geçer ve yeniden çalışınca **Yapılıyor** sütununa döner. Yeşil nokta dsh'nin kendi “bitti” noktasıdır ve dsh onu yalnız bu pencerede tutar: sayfa yeniden yüklenince biten sohbetler noktasız görünür. **Bitti** en yeni 50 sohbeti gösterir (**Daha eski N görevi göster** kalanları gösterir). **Projelerde ara** bir projeyi yalnız adıyla bulur, klasör yoluyla bulmaz. **Son 2 saatte aktif olanlar**, bir projenin her sohbeti 2 saatten eski, boşta ve okunmuş olduğunda o projeyi gizler; pano, seçtiğiniz projeyi yine gösterir. **Yeni görev**, bu penceredeki yeni sohbetlerden yalnız en yenisini hatırlar: ilk mesajdan önce başka bir sohbet açarsanız o sohbet, siz içine yazana kadar **Yapılıyor** sütununun en üstünde **Yeni görev** olarak kalır, ama pano yalnız en yenisi için kendiliğinden geri gelir. Sayfa yeniden yüklenince mesajı olmayan yeni sohbet panoda görünmez (dsh onu kendi boş Yeni oturumu olarak tutar). Etiketler, her görev için ilk mesajından yapılan tek bir model çağrısından gelir: yanlış olabilirler ve panoda başlatmadığınız bir sohbetin etiketi yoktur. Başlık, dsh'nin kendi sohbet başlığıdır (dsh'nin başlık hizmeti, sohbetin modeliyle); başlık gelene kadar kart ilk mesajın ilk satırını gösterir. **×** ve **Tümünü temizle** kartları yalnız panodan kaldırır: hiçbir sohbet silinmez. **Geri al** yalnız 8 saniye ve yalnız bu pencerede görünür; daha sonra **Kaldırılanlar (N)** → **Panoya geri koy** bir kartı geri getirir, yeniden çalışan bir sohbet de kendiliğinden geri gelir. **Tümünü temizle** önce sorar, sonra gösterilen projenin okunmuş biten kartlarını (**Tüm projeler** seçiliyken tüm projelerinkini), **Daha eski N görevi göster** arkasında kalanlar da dahil, panodan kaldırır; okunmamış (yeşil) kart kalır. dsh yeşil noktasını yalnız bu pencerede tutar, bu yüzden sayfa yeniden yüklendikten sonra Tümünü temizle, yanıtını okumadığınız bir kartı da kaldırabilir. Liste bu Mac'te tutulur ve her pencerede ve Tether'da geçerlidir; listede 5.000 sohbet olunca en eskileri geri gelir. **Yanıtla** yalnız sohbetin en yeni isteğini yanıtlar: sohbet o isteği başka bir yerde yanıtladıysa (başka bir pencere, Tether, Otomatik inceleme) ya da yeni bir şey soruyorsa panel bunu söyler ve hiçbir şey göndermez. Önceki sürümlerde yorumlu bir görev listesi ve ajan araçları vardı; bunlar kaldırıldı ve eski `board.json` gösterilmez. Fikir ve görünüm emanuele-em'in [Kanzo](https://github.com/emanuele-em/kanzo) projesinden gelir (AGPL-3.0); Composer Plus onun kodunu kullanmaz. `Cmd+Shift+K` bir dsh kısayoludur: Linux’taki tarayıcıda varsayılan tuşu yoktur (dsh’nin Klavye kısayolları sayfasında bir tuş atayın) ve bir tarayıcı uzantısı ya da başka bir uygulama tuşu önce alabilir. Bir kart, dsh’nin kendi yeşil noktası gidince (sohbeti açtığınızda) **Bitti** sütunundan çıkar; panonun arkasında açık sohbetken biten bir sohbet için, o sohbet üstünde panel olmadan görününce çıkar. Bu okundu bilgisi dsh’nin kendi noktaları gibi yalnız bu dsh penceresinde tutulur: sayfayı yenileyince ya da başka bir pencerede biten her sohbet okunmuş sayılır, yani **Son bitenler** içindedir.
299
+ - **Asistan** bu Mac'in tüm pencereleri için tek bir sohbettir. workspace-write izin moduyla çalışır: dosyaları yalnız `~/Assistant` içine yazar, dışarıda çalışacak bir komut önce sorar. Sohbeti onaysız bir moda (Tam erişim) geçirirseniz dsh her onayı reddeder, bu yüzden asistan sohbete mesaj gönderemez, sohbet açamaz, durduramaz ya da arşivleyemez. Onay kartı yalnız altı aracı korur: asistanın çalıştırdığı bir kabuk komutu, o moddaki her sohbette olduğu gibi ağa yine erişebilir. dsh 0.2.0 ve 0.2.1'de dsh'nin zamanlanmış görev araçları yalnız asistan sohbetinin kendi hatırlatmalarını görür, öteki sohbetlerin otomasyonlarını görmez. dsh 0.2.2'den başlayarak tüm zamanlanmış görevleri listeler ve değiştirir. chats_list arşivlenmiş, boş ve alt ajan sohbetlerini ve asistan sohbetinin kendisini göstermez. "Sizi bekliyor", çalışan bir sohbette yanıtlanmamış bir onay, soru ya da plan incelemesi demektir. chat_read kullanıcının mesajlarını ve ajanın yanıtlarını verir (araç çıktısı yok), en çok 50 mesaj ve yaklaşık 24.000 karakter. chat_archive hâlâ çalışan ya da etkin hatırlatması olan bir sohbeti reddeder. Model okuduğu bir metinle yine de yanıltılabilir: son kontrol onay kartıdır, **Bir kez izin ver**'e tıklamadan önce kartı okuyun.
297
300
  - **Durdurduktan sonra gönderilen önce gider** yalnız sohbeti durdurduktan sonra çalışır (ya da bir tur hata verdikten sonra veya hâlâ kuyruğu olan bir sohbeti açtığınızda): bir tur çalışırken gönderdiğiniz mesaj yine kuyruğun sonunda bekler. Mesaj yalnız sizin kuyruktaki mesajlarınızın önüne geçer: kuyrukta bir hedef turu ya da bir soru yanıtı bekliyorsa dsh’nin kendi sırası kalır. dsh’nin herkese açık API olmayan bir bölümünü okur (durdurulan turun hâlâ bitip bitmediğini); bir dsh güncellemesi bunun adını değiştirirse mesaj, o tur bittikten sonra öne alınır. Alt ajan sohbetleri dsh’nin kendi sırasını korur.
298
301
  - **Proje hafızası** sohbetin ilk klasörüne (dsh'nin proje klasörüne) aittir: klasörünü `cd` ile değiştiren bir sohbet ilk projesinin hafızasını kullanmaya devam eder; aynı klasör aynı dosyalara giden başka bir yoldan açılırsa hafızayı paylaşır. Bir sohbet, başladığında hafıza bölümünü dondurur; bu yüzden sonra kaydedilen bir not bir sonraki sohbette görünür (`memory_recall` onu hemen bulur). İnceleme yalnız modelin saklamaya karar verdiği şeyi saklar: bir olguyu kaçırabilir ya da yanlış bir şeyi saklayabilir. Notları **Hafızayı aç** içinde kontrol edip orada değiştirin ya da dsh kapalıyken dosyaları elle düzenleyin. **Hafızayı aç**, seçili projenin notlarını ve genel notları (Tüm notlar seçiliyse bütün projeleri; en çok yaklaşık 60.000 karakter, kalanı yalnız sayılır ve o istekte değişemez) ve yazdığınız metni sohbetin modeline değil, dsh’nin varsayılan modeline gönderir. Önizleme Mac’te 30 dakika ve dsh yeniden başlayana kadar tutulur; bu arada bir inceleme ya da ajan notları değiştirirse **Uygula** reddeder ve yeniden önizlersiniz. **Uygula** bir önizlemenin ya bütün değişikliklerini ya hiçbirini kaydeder: bir değişiklik kaydedilemezse (örneğin MEMORY.md doluysa) notlar olduğu gibi kalır ve nedeni görünür. Sizden bir mesaj içeren her bitmiş tur bir model çağrısına mal olur; başarısız bir çağrı, sonraki turdan sonra aynı mesajları yeniden okur. Alt ajan sohbetleri incelenmez. Fikir ve dosya biçimi [DS Bot](https://github.com/Fei2411/DS-Bot) projesinden gelir (Apache-2.0); Composer Plus onun kodunu kullanmaz ve DS Bot'un kendi hafızasını hiçbir zaman okumaz ya da yazmaz.
299
302
  - **Hafıza sürüm geçmişi** her hafızanın (her proje ve genel hafıza) en yeni 50 sürümünü tutar; daha eskileri silinir. Bir sürüm tek bir notu değil, o projenin hafızasının tamamını tutar. **Geri yükle** o sürümün bütün dosyalarını (konular dahil) geri koyar; sürümü açtıktan sonra hafıza değiştiyse geri yüklemeyi reddeder. Geri yüklemeden önceki hafıza yeni bir sürüm olur, bu yüzden geri yüklemeyi geri alabilirsiniz. Anahtar kapalıyken yeni sürüm tutulmaz ve **Geri yükle** reddedilir; tutulmuş sürümler kalır. Bu özellikten önceki bir sürüm yoktur: geçmiş, kurulumdan sonraki ilk kayıtla başlar.
@@ -347,6 +350,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
347
350
 
348
351
  **Tüm sohbetlerimi bir kanban panosu olarak görüp panodan yeni sohbet başlatabilir miyim?** Evet, **Görev panosu** ile (varsayılan olarak açık): sol kenar çubuğundan açın. Her sohbet **Yapılıyor**, **İncelemede** (sizi bekler) ya da **Bitti** sütununda bir karttır. **Yeni görev** projede dsh'nin yeni sohbetini açar ve ilk mesajınız gidince pano geri gelir; bir sohbeti açmadan yanıtlamak için turuncu karttaki **Yanıtla** düğmesine tıklayın. **Bitti** sütunundaki **Tümünü temizle** önce sorar ve okuduğunuz biten kartları panodan kaldırır; **Geri al** ve **Kaldırılanlar (N)** onları geri getirir, sohbetler dsh'de kalır.
349
352
 
353
+ **Bana hatırlatma yapan ve öteki sohbetlerimi yöneten kişisel bir asistan sohbetim olabilir mi?** Evet, **Asistan** ile (varsayılan olarak kapalı): Ayarlar → Composer Plus içinden açın, sonra sol kenar çubuğunda **Asistan**'a tıklayın. dsh'nin zamanlanmış görevleriyle hatırlatma kurar, web'de arar, sohbetlerinizi listeler ve okur. Bir sohbete mesaj göndermek ya da sohbet açmak, durdurmak, arşivlemek için önce onayınızı ister. Profilinizi bu projenin hafızasında, "profil" konusunda tutun.
354
+
350
355
  **dsh, dsh-backup gibi sohbetlerimi ve ayarlarımı yedekleyebilir mi?** Evet: **Ayarlar → Composer Plus → Yedekleme → Şimdi yedekle**. Aynı arşiv biçimini aynı klasöre (`~/Desktop/dsh-backups`) yazar. Bu yüzden dsh-backup’ın arşivleri de görünür ve geri yüklenebilir; dsh-backup’ı kaldırabilirsiniz. Zamanlanmış yedekleme için **Otomatik yedekleme** ayarını açın.
351
356
 
352
357
  **dsh artık açılmıyor. Bir yedeği nasıl geri yüklerim?** Yedek klasörünü (`~/Desktop/dsh-backups`) açın ve `Composer Plus Rescue.command` dosyasına çift tıklayın (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). `3) Restore a backup` seçeneğini seçin, bir yedek seçin ve `RESTORE` yazın. Bu, dsh olmadan çalışır.
@@ -389,7 +394,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
389
394
 
390
395
  **iPhone’umu kaybettim. Mac’ime erişmesini nasıl engellerim?** Kenar çubuğunun sol altındaki **Mobil bağlantı** düğmesine tıklayın, sonra o iPhone’un yanındaki **Remove** düğmesine tıklayın. iPhone’un anahtarı hemen geçersiz olur. iPhone, ancak sizin Mac’te onayladığınız yeni bir eşleştirmeyle yeniden bağlanabilir.
391
396
 
392
- **Diğer Mac’imdeki bir sohbete bu Mac’ten nasıl devam ederim?** Diğer Mac’te **Ayarlar → Composer Plus → Uzak bilgisayarlar** ve **Diğer bilgisayarların bu Mac’i açmasına izin ver** seçeneklerini açın. **Eşleştirme bağlantısı oluştur** düğmesine tıklayın ve bağlantıyı kopyalayın (bağlantıyı kendinize gönderin, örneğin AirDrop ya da Notlar ile). Bu Mac’te de **Uzak bilgisayarlar** özelliğini açın. Sol kenar çubuğundaki seçicide (marka adının sağında, **Yeni oturum** düğmesinin üstünde) **Bilgisayar ekle…** seçeneğini seçin, bağlantıyı yapıştırın, bir **Ad** yazın ve **Bağlan** düğmesine tıklayın. Sonra diğer Mac’te **Onayla** düğmesine tıklayın. Bundan sonra o bilgisayarı aynı menüden seçin: bu pencereyi kaplar. Geri dönmek için aynı yerde **Bu Mac** seçeneğini seçin. Bu sırada bu Mac’teki sohbetler çalışmaya devam eder.
397
+ **Diğer Mac’imdeki bir sohbete bu Mac’ten nasıl devam ederim?** Diğer Mac’te **Ayarlar → Composer Plus → Uzak bilgisayarlar** ve **Diğer bilgisayarların bu Mac’i açmasına izin ver** seçeneklerini açın. **Eşleştirme bağlantısı oluştur** düğmesine tıklayın ve bağlantıyı kopyalayın (bağlantıyı kendinize gönderin, örneğin AirDrop ya da Notlar ile). Bu Mac’te de **Uzak bilgisayarlar** özelliğini açın. Sol kenar çubuğundaki seçicide (marka adının sağında, **Yeni oturum** düğmesinin üstünde) **Bilgisayar ekle…** seçeneğini seçin, bağlantıyı yapıştırın, bir **Ad** yazın ve **Bağlan** düğmesine tıklayın. Sonra diğer Mac’te **Onayla** düğmesine tıklayın. Bundan sonra o bilgisayarı aynı menüden seçin: bu pencereyi kaplar. Geri dönmek için aynı yerde **Bu Mac’e dön** düğmesine tıklayın. Bu sırada bu Mac’teki sohbetler çalışmaya devam eder.
393
398
 
394
399
  **Tether’i Face ID ile kilitleyebilir miyim?** Evet: Tether’de "Settings → Privacy → Lock with Face ID" seçeneğini açın. Bundan sonra Tether, açıldığında ve ona geri döndüğünüzde Face ID (ya da parola) ister.
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh
package/README.vi.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Sau đó khởi động lại dsh. (CLI không cài được vào profile desktop; ứng dụng tự quản lý profile này.)
31
31
 
32
- > pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.23.0`.
32
+ > pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## Tính năng
35
35
 
@@ -75,6 +75,7 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
75
75
  | **Tệp được bảo vệ** | <a id="feature-protectedfiles"></a>Bật theo mặc định. Các công cụ tệp riêng của tác tử không thể đọc hoặc thay đổi các tệp khớp với mẫu của bạn: `read`, `read_image` và `grep` trên một tệp bị từ chối với mẫu **đọc và ghi**, còn `write`, `edit` và `str_replace_editor` bị từ chối với cả hai loại. Tác tử đọc lý do và được yêu cầu hỏi bạn. Mẫu mặc định là `.env*`, `*.pem` và `*.key`. Cài đặt → Composer Plus → **Tệp được bảo vệ**: thêm một mẫu (ví dụ `published/**` hoặc `config/*.yml`), nhấp vào loại của mẫu để chuyển giữa **đọc và ghi** và **chỉ ghi**, xóa mẫu bằng ✕, hoặc nhấp **Dùng giá trị mặc định**. Mẫu không có `/` khớp với tên tệp trong bất kỳ thư mục nào. Đây là rào chắn bảo vệ, không phải sandbox: lệnh shell (`cat .env`), script hoặc công cụ MCP vẫn có thể truy cập tệp (xem Giới hạn). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ảnh chụp màn hình: Tệp được bảo vệ"></a> |
76
76
  | **Lệnh bị chặn** | <a id="feature-blockedcommands"></a>Bật theo mặc định, với danh sách trống. Các lệnh shell của tác tử (`bash`, `pwsh`) không thể chạy lệnh khớp với quy tắc của bạn: quy tắc **chặn** từ chối lệnh gọi (tác tử đọc lý do và được yêu cầu hỏi bạn), quy tắc **hỏi trước** hiện thẻ phê duyệt của dsh, và lệnh chỉ chạy khi bạn cho phép. Cài đặt → Composer Plus → **Lệnh bị chặn**: nhập một quy tắc (ví dụ `npm publish`, `git push --force` hoặc `ssh *192.168.2.19`), nhấp vào loại để chuyển giữa **chặn** và **hỏi trước**, rồi nhấp **Thêm**; nhấp vào loại của một quy tắc để đổi loại, xóa quy tắc bằng ✕. Một quy tắc là tên lệnh và các từ phải đứng sau nó theo đúng thứ tự này; `*` khớp với mọi văn bản. Tính năng cũng tìm thấy lệnh sau `&&`, `;`, `\|`, bên trong `$(…)`, `bash -c "…"` hoặc `eval`, và sau `sudo` hoặc `env`. Đây là rào chắn bảo vệ, không phải sandbox: một biến (`$CMD`), một tệp script hoặc một chương trình khác vẫn có thể chạy lệnh (xem Giới hạn). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ảnh chụp màn hình: Lệnh bị chặn"></a> |
77
77
  | **Bảng tác vụ** | <a id="feature-taskboard"></a>Thanh bên trái → **Bảng tác vụ**, hoặc nhấn `Cmd+Shift+K` (`Ctrl+Shift+K` trên Windows và Linux) ở bất kỳ đâu trong dsh. Bảng kanban các cuộc trò chuyện dsh của bạn với trạng thái trực tiếp giống thanh bên: cuộc trò chuyện đang chờ bạn phê duyệt, trả lời hoặc xem xét kế hoạch nằm ở **Đang duyệt** với chấm cam, cuộc trò chuyện đang chạy nằm ở **Đang làm**, cuộc trò chuyện đã xong mà bạn chưa mở nằm ở **Xong** (màu xanh lá). Khi bạn mở một cuộc trò chuyện, thẻ của nó tự rời **Xong**; nhấp **Vừa xong (N)** bên dưới các thẻ xanh lá để xem các cuộc trò chuyện đã xong mà bạn đã đọc (10 mục mới nhất, sau đó **Hiện N tác vụ cũ hơn**; trạng thái mở hoặc đóng được lưu trên thiết bị này). Cuộc trò chuyện xong khi đang mở phía sau bảng (một **Tác vụ mới**) vẫn màu xanh lá cho đến khi bạn mở. Nhấp vào tên dự án ở đầu bảng để mở danh sách dự án, rồi chọn một dự án hoặc **Tất cả dự án**; thư mục branch riêng của từng cuộc trò chuyện được tính là thuộc dự án của nó. Danh sách đóng sau khi bạn chọn, khi nhấn `Esc` hoặc khi nhấp ra ngoài. Gõ vào **Tìm dự án** ở đầu danh sách để tìm dự án theo tên (không phân biệt chữ hoa, chữ thường và dấu; `Esc` xóa trống ô), nhấn `Enter` để chọn kết quả khớp đầu tiên, và nhấp **Hoạt động trong 2 giờ qua** để chỉ hiện các dự án có cuộc trò chuyện đang chờ, đang chạy, đã xong mà chưa xem hoặc đã thay đổi trong 2 giờ qua (được lưu trên thiết bị này). **Tác vụ mới** (hoặc `n`) mở cuộc trò chuyện mới của chính dsh trong dự án mà bảng đang hiện (với **Tất cả dự án**, đó là dự án mà Phiên mới của dsh chọn), nên bạn có thể thêm tệp, dùng lệnh và chọn mô hình như trong mọi cuộc trò chuyện. Khi tin nhắn đầu tiên của bạn được gửi, bảng tự quay lại. Trước đó, cuộc trò chuyện chờ ở trên cùng của **Đang làm** dưới tên **Tác vụ mới**: nhấp vào nó để viết tin nhắn đầu tiên. Dự án có cuộc trò chuyện đang chờ bạn có một chấm cam trong danh sách dự án (tên dự án ở đầu bảng cũng có chấm này khi có cuộc trò chuyện đang chờ). dsh đặt tên cho cuộc trò chuyện và mô hình của cuộc trò chuyện viết tối đa 3 nhãn từ tin nhắn đó. Nhấp vào thẻ để mở cuộc trò chuyện của nó. Nhấp vào thẻ màu cam (hoặc nút **Trả lời** của nó) để trả lời ngay trên bảng; bảng này có **Mở cuộc trò chuyện** để xem cả cuộc trò chuyện: **Từ chối** hoặc **Cho phép một lần**, **Phê duyệt** hoặc **Yêu cầu thay đổi** cho một kế hoạch, hoặc các lựa chọn và văn bản của riêng bạn cho một câu hỏi. Nhấp **×** trên một thẻ đã xong để gỡ thẻ đó khỏi bảng, hoặc mở **Vừa xong** rồi nhấp **Gỡ tất cả** ở đầu cột **Xong** để gỡ các thẻ đó khỏi bảng: trước tiên một hộp thoại cho biết bao nhiêu thẻ của dự án nào sẽ bị gỡ, và các thẻ chưa đọc (màu xanh lá) vẫn ở lại. Trong 8 giây sau đó, **Hoàn tác** đưa các thẻ trở lại; **Đã gỡ (N)** bên dưới **Xong** liệt kê các thẻ đang ở ngoài bảng, và **Đưa lại lên bảng** hiện lại một thẻ trong **Xong**. Không cuộc trò chuyện nào bị xóa: các cuộc trò chuyện vẫn ở thanh bên của dsh, bảng nhớ điều này sau khi khởi động lại (Tether hiện cùng một bảng), và cuộc trò chuyện chạy lại sẽ quay lại bảng. Trỏ vào một thẻ ở **Đang làm** (hoặc chuyển tiêu điểm bàn phím đến thẻ đó) để xem tiến độ: cuộc trò chuyện đã chạy bao lâu, bước trong danh sách việc cần làm, công cụ đang chạy và dòng cuối của tác tử. Trong Cài đặt → Composer Plus → Bảng tác vụ, **Tiến độ khi di chuột** chọn **Nhanh (không dùng AI)** (mặc định: chỉ đọc cuộc trò chuyện) hoặc **Tóm tắt bằng AI** (một lệnh gọi ngắn tới mô hình của cuộc trò chuyện viết thêm một hoặc hai câu). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ảnh chụp màn hình: Bảng tác vụ"></a> |
78
+ | **Trợ lý** | <a id="feature-assistant"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Sau đó nhấp **Trợ lý** ở thanh bên trái (ngay bên dưới **Bảng tác vụ**): tính năng này mở một cuộc trò chuyện lâu dài mà bạn dùng làm trợ lý cá nhân, giống một cuộc trò chuyện ChatGPT hoặc Grok. Lần nhấp đầu tiên tạo thư mục `~/Assistant`, thêm thư mục này làm dự án “Assistant” và bắt đầu cuộc trò chuyện với chế độ quyền workspace-write và mô hình mặc định của dsh; mỗi lần nhấp sau đó mở cùng cuộc trò chuyện đó (cuộc trò chuyện đã lưu trữ sẽ quay lại, cuộc trò chuyện đã xóa sẽ được tạo lại). Nhờ trợ lý nhắc bạn (“nhắc tôi uống nước sau 2 phút”): trợ lý dùng các tác vụ theo lịch của dsh, nên lời nhắc chạy cuộc trò chuyện vào thời điểm đó, và Tether gửi thông báo “Turn finished” khi Kết nối di động đang bật. Nhờ trợ lý tìm kiếm trên web, hoặc hỏi về các cuộc trò chuyện khác của bạn: trợ lý có thể liệt kê các cuộc trò chuyện của mọi dự án (đang chạy, đang chờ bạn hoặc nhàn rỗi) và đọc các tin nhắn mới nhất của một cuộc trò chuyện. Trợ lý cũng có thể gửi tin nhắn đến một cuộc trò chuyện, bắt đầu cuộc trò chuyện mới trong một dự án, dừng một cuộc trò chuyện đang chạy hoặc lưu trữ một cuộc trò chuyện: mỗi thao tác trong bốn thao tác này đều hiện thẻ phê duyệt của dsh trước (cả trong Tether), và không có gì xảy ra cho đến khi bạn nhấp **Cho phép một lần**. Trợ lý không có công cụ xóa. Chỉ cuộc trò chuyện này có các công cụ này và chỉ dẫn ngắn của nó; văn bản mà trợ lý đọc trong một trang web hoặc một cuộc trò chuyện khác được xem là dữ liệu, không phải mệnh lệnh. Hãy lưu hồ sơ của bạn trong bộ nhớ của dự án này (**Bộ nhớ dự án**, chủ đề “profil”) thay vì phải nói lại mỗi lần. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Ảnh chụp màn hình: Trợ lý"></a> |
78
79
  | **Bộ nhớ dự án** | <a id="feature-projectmemory"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Mỗi thư mục dự án có bộ nhớ riêng, các cuộc trò chuyện sau này của dự án đó sẽ đọc, giống như DS Bot giữ một bộ nhớ cho mỗi Bot. Sau mỗi lượt kết thúc, một lần gọi mô hình của cuộc trò chuyện đọc các tin nhắn mới (không đọc tin nhắn đã hoàn tác), lưu sở thích, quyết định và dữ kiện lâu dài của bạn thành ghi chú ngắn, đồng thời sửa hoặc xóa ghi chú cũ. Tác tử cũng có thể tự lưu, xóa và tìm ghi chú (`memory_remember`, `memory_forget`, `memory_recall`). Ghi chú cũng có thể là ghi chú chung: mọi dự án đều đọc. Cuộc trò chuyện mới nhận các ghi chú trong system prompt; ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo. Các tệp là Markdown trong thư mục home của dsh (`storages/dsh-composer-plus/memory/`), không bao giờ nằm trong thư mục dự án. **Mở bộ nhớ** ở cùng hàng hiển thị mọi ghi chú đã lưu, nhóm theo dự án (và bộ nhớ chung), có bộ lọc. Viết bằng lời của bạn điều cần thay đổi (ví dụ "tôi đã chuyển từ yarn sang pnpm"), rồi bấm **Xem trước thay đổi**: mô hình mặc định của dsh đề xuất các thay đổi, và chỉ **Áp dụng** mới lưu chúng. Trong Tether: menu tiêu đề cuộc trò chuyện → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ảnh chụp màn hình: Bộ nhớ dự án"></a> |
79
80
  | **Lịch sử phiên bản bộ nhớ** | <a id="feature-memoryhistory"></a>Bật theo mặc định khi **Bộ nhớ dự án** đang bật. Trước mỗi lần lưu bộ nhớ (tác tử, bước xem lại sau một lượt, **Mở bộ nhớ**), một bản sao của ghi chú như trước đó được giữ lại. Trong **Mở bộ nhớ**, chọn một dự án hoặc **Bộ nhớ chung**, rồi **Lịch sử**: các phiên bản theo ngày và ai đã thay đổi bộ nhớ sau mỗi phiên bản. Chọn một phiên bản để xem dưới dạng diff những gì khôi phục sẽ thay đổi, rồi **Khôi phục**. Ghi chú trước khi khôi phục cũng được giữ, nên bạn có thể hoàn tác. 50 phiên bản mới nhất của mỗi bộ nhớ được giữ lại. Trong Tether: menu tiêu đề cuộc trò chuyện → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Ảnh chụp màn hình: Lịch sử phiên bản bộ nhớ"></a> |
80
81
  | **Xuất bộ nhớ ra AGENTS.md** | <a id="feature-memoryexport"></a>Trong **Mở bộ nhớ**, chọn một dự án, rồi **Xuất ra AGENTS.md**: ghi chú của dự án đó được ghi vào một phần có đánh dấu của `AGENTS.md` trong thư mục dự án, để bạn có thể commit và chia sẻ với nhóm và các công cụ tác tử khác. Bạn xem thay đổi dưới dạng diff trước; chỉ **Ghi AGENTS.md** mới lưu. Lần xuất sau chỉ thay thế phần đó. Bộ nhớ chung, nguồn và ngày không được ghi. Trong Tether: menu tiêu đề cuộc trò chuyện → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Ảnh chụp màn hình: Xuất bộ nhớ ra AGENTS.md"></a> |
@@ -103,7 +104,7 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
103
104
  | **Nút lựa chọn** | <a id="feature-optionpicks"></a>Khi một câu trả lời kết thúc bằng một danh sách lựa chọn (danh sách đánh số từ 1 đến 9 mục dưới tiêu đề "Lựa chọn" hoặc một dòng in đậm "Lựa chọn", cũng như "Các bước tiếp theo" và các từ tương tự trong các ngôn ngữ của ứng dụng), mỗi lựa chọn có một nút bên dưới câu trả lời. Nhấp vào nút sẽ gửi "Option N: …" kèm toàn bộ lựa chọn làm tin nhắn của bạn, như thể bạn tự gõ. Lựa chọn có ghi "(đề xuất)" được làm nổi bật. Các nút chỉ hiện dưới câu trả lời mới nhất, khi cuộc trò chuyện đang rảnh và ô nhập tin nhắn trống; câu trả lời đã được chọn và câu trả lời đã bị hoàn tác thì không có nút. Khi các nút đang hiện, Dự đoán tin nhắn tiếp theo không đưa ra gợi ý. Trên thẻ câu hỏi của tác tử, các phím 1–9 chọn lựa chọn đó giống như một cú nhấp (không áp dụng trong ô trả lời và trong 0,8 giây đầu sau khi câu hỏi hiện ra). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Ảnh chụp màn hình: Nút lựa chọn"></a> |
104
105
  | **Ngôn ngữ ứng dụng** | <a id="feature-language"></a>Cài đặt → Composer Plus → **Ngôn ngữ ứng dụng** chuyển toàn bộ giao diện dsh sang Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt hoặc हिन्दी (xem bên dưới). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Ảnh chụp màn hình: Ngôn ngữ ứng dụng"></a> |
105
106
  | **Kết nối di động (iPhone)** | <a id="feature-mobileconnect"></a>Dùng dsh từ iPhone với ứng dụng [Tether](tether/), trong cùng mạng Wi-Fi hoặc qua [Tailscale](https://tailscale.com). Bật tính năng trong **Cài đặt → Composer Plus** (mặc định tắt, vì tính năng này mở một cổng mạng trên máy Mac này). Sau đó nhấp **Kết nối di động** ở góc dưới bên trái thanh bên: quét mã QR bằng Camera của iPhone (chạm vào **Open in Tether**) hoặc bằng **Scan code** trong Tether, chạm vào **Connect** và nhấp **Approve**. Hãy cài đặt Tether trước: nếu không có Tether, Camera không thể mở mã này. Điện thoại hiện các cuộc trò chuyện của bạn, gửi tin nhắn (kèm ảnh: **+** trong khung soạn thảo → Camera, Photos hoặc Paste image), trả lời phê duyệt và câu hỏi, và chuyển đổi mô hình và agent. Bạn có thể ghép nối bao nhiêu máy Mac tùy ý: tên máy Mac ở góc trên bên trái ứng dụng dùng để chuyển giữa các máy. Bảng **Kết nối di động** liệt kê các iPhone đã ghép nối kèm lần kết nối gần nhất: **Remove** ngắt ngay một máy. “Tailscale only” từ chối mạng cục bộ (dành cho Wi-Fi dùng chung), và nhật ký truy cập cho biết ai đã thử kết nối. Trong Tether, “Settings → Privacy” khóa ứng dụng bằng Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ảnh chụp màn hình: Kết nối di động (iPhone)"></a> |
106
- | **Máy tính từ xa** | <a id="feature-remotecomputers"></a>Mở dsh của các máy Mac khác của bạn qua [Tailscale](https://tailscale.com) và dùng chúng trong cửa sổ dsh này. Bật tính năng trong **Cài đặt → Composer Plus** trên từng máy Mac (mặc định tắt, vì tính năng này mở các cổng mạng). Trên máy Mac bạn muốn mở, bật **Cho phép máy tính khác mở máy Mac này**, nhấp **Tạo liên kết ghép nối** và sao chép liên kết. Trên máy Mac này, chọn **Thêm máy tính…** trong bộ chọn máy tính ở thanh bên trái (bên phải tên thương hiệu, phía trên **Phiên mới**), dán liên kết, nhập **Tên** (không trùng tên máy Mac này hoặc tên máy tính khác) và nhấp **Kết nối**. Sau đó nhấp **Phê duyệt** trên máy Mac kia. Từ đó, bộ chọn liệt kê **Máy Mac này** và các máy tính của bạn: chọn một máy, và dsh của máy đó lấp đầy cửa sổ này, với các cuộc trò chuyện, thanh bên, công cụ và tệp của chính máy đó, trong khi máy Mac này vẫn chạy phía sau. Máy Mac kia hiện cùng bộ chọn ở cùng vị trí: chọn **Máy Mac này** ở đó để quay lại. Bảng Cài đặt đổi tên và xóa máy tính, và liệt kê các máy tính có thể mở máy Mac này (**Xóa** ngắt ngay một máy). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Ảnh chụp màn hình: Máy tính từ xa"></a> |
107
+ | **Máy tính từ xa** | <a id="feature-remotecomputers"></a>Mở dsh của các máy Mac khác của bạn qua [Tailscale](https://tailscale.com) và dùng chúng trong cửa sổ dsh này. Bật tính năng trong **Cài đặt → Composer Plus** trên từng máy Mac (mặc định tắt, vì tính năng này mở các cổng mạng). Trên máy Mac bạn muốn mở, bật **Cho phép máy tính khác mở máy Mac này**, nhấp **Tạo liên kết ghép nối** và sao chép liên kết. Trên máy Mac này, chọn **Thêm máy tính…** trong bộ chọn máy tính ở thanh bên trái (bên phải tên thương hiệu, phía trên **Phiên mới**), dán liên kết, nhập **Tên** (không trùng tên máy Mac này hoặc tên máy tính khác) và nhấp **Kết nối**. Sau đó nhấp **Phê duyệt** trên máy Mac kia. Từ đó, bộ chọn liệt kê **Máy Mac này** và các máy tính của bạn: chọn một máy, và dsh của máy đó lấp đầy cửa sổ này, với các cuộc trò chuyện, thanh bên, công cụ và tệp của chính máy đó, trong khi máy Mac này vẫn chạy phía sau. Bộ chọn vẫn ở cùng vị trí và hiện **Quay lại máy Mac này**: nhấp vào đó để quay lại. Nếu bạn có nhiều hơn một máy tính, cú nhấp sẽ mở menu, nơi bạn chọn **Máy Mac này** hoặc một máy tính khác. Bảng Cài đặt đổi tên và xóa máy tính, và liệt kê các máy tính có thể mở máy Mac này (**Xóa** ngắt ngay một máy). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Ảnh chụp màn hình: Máy tính từ xa"></a> |
107
108
  | **Tự động cập nhật** | <a id="feature-autoupdate"></a>Khi dsh khởi động, plugin kiểm tra [bản phát hành GitHub mới nhất](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Nếu bản đó mới hơn và đã có trên npm, plugin cài đúng phiên bản đó qua trình quản lý plugin của chính dsh (cùng cách với Cài đặt → Plugin) và thông báo cho bạn. Khởi động lại dsh để tải bản mới. **Cài đặt → Composer Plus → Cập nhật Composer Plus** hiện phiên bản và có nút **Kiểm tra cập nhật** / **Cập nhật ngay**. Lần đầu dsh khởi động với phiên bản mới, cửa sổ **Có gì mới trong Composer Plus N** hiện ghi chú phát hành của phiên bản đó một lần bằng ngôn ngữ trong **Ngôn ngữ ứng dụng** (ghi chú đi kèm phiên bản mới, không gọi mạng thêm; ngôn ngữ không có ghi chú sẽ hiện ghi chú tiếng Anh); **Đóng** hoặc `Esc` đóng nó. Bên dưới ghi chú, một dòng mời bạn gắn sao trên GitHub, tối đa một lần mỗi 30 ngày (không gọi mạng); sau khi bấm **Gắn sao trên GitHub** hoặc **Không hỏi lại**, dòng này không hiện nữa. Cửa sổ cũng hiện sau khi cập nhật qua Cài đặt → Plugin hoặc một thư mục được sao chép, một lần cho mỗi phiên bản mới; không hiện ở lần cài đặt đầu tiên. **Có gì mới trong phiên bản này** ở hàng cập nhật mở lại cửa sổ. Khi trên đĩa có phiên bản mới hơn phiên bản đang chạy, hàng này yêu cầu khởi động lại dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ảnh chụp màn hình: Tự động cập nhật"></a> |
108
109
  | **Bộ lọc bật/tắt** | <a id="feature-featurefilter"></a>Bên cạnh **Tìm tính năng** trong **Cài đặt → Composer Plus**: **Tất cả** hiện mọi tính năng, **Bật** chỉ hiện các tính năng có công tắc đang bật, **Tắt** chỉ hiện các tính năng có công tắc đang tắt. Công tắc của từng dòng quyết định, kể cả công tắc do Host của dsh lưu (ví dụ **Kết nối di động**). Bộ lọc dùng cùng với tìm kiếm: gõ một từ rồi chọn **Tắt** để tìm tính năng bạn đã tắt. Dòng bạn chuyển khi đang chọn **Bật** hoặc **Tắt** vẫn ở lại cho đến khi bạn chọn lại một bộ lọc, nên tiêu điểm vẫn ở công tắc của nó. **Bật** và **Tắt** ẩn các dòng **Ngôn ngữ ứng dụng** và **Cập nhật Composer Plus** (chúng không có công tắc). Cài đặt luôn mở với **Tất cả**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Ảnh chụp màn hình: Bộ lọc bật/tắt"></a> |
109
110
  | **Báo cáo issue** | <a id="feature-issuereport"></a>Cài đặt → Composer Plus → **Báo cáo issue…** (bên dưới phần giới thiệu), hoặc nhấp chuột phải vào một cuộc trò chuyện trên thanh bên (hoặc mở menu **…** của nó) → **Báo cáo issue về Composer Plus…**. Chọn một loại: **Lỗi**, **Yêu cầu tính năng**, **Cải tiến**, **Bản dịch** hoặc **Câu hỏi**. Mô tả bằng lời và ngôn ngữ của riêng bạn, rồi nhấp **Viết bản nháp** (hoặc `Cmd/Ctrl+Enter`). Một lần gọi mô hình mặc định của dsh viết một issue bằng tiếng Anh: tiêu đề có tiền tố của loại (ví dụ `[Bug]`) và các phần của loại đó (với lỗi: What happened, Steps to reproduce, Expected, Actual), kèm một dòng với phiên bản của Composer Plus, dsh và hệ thống. Đọc và sửa tiêu đề và mô tả; **Viết lại** viết một bản nháp mới. **Mở issue** mở issue trong repository GitHub của Composer Plus bằng đăng nhập GitHub CLI (`gh`) của bạn và hiện liên kết của issue. Issue được công khai: văn bản trông giống khóa hoặc mật khẩu sẽ bị từ chối. Khi `gh` không mở được issue, **Mở trên GitHub thay vào đó** mở trang riêng của GitHub với bản nháp đã điền sẵn. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Ảnh chụp màn hình: Báo cáo issue"></a> |
@@ -198,6 +199,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
198
199
  - **Tiếp tục trong cuộc trò chuyện mới:** không có gì chạy cho đến khi bạn nhấp. Sau đó phần Host gửi cuộc trò chuyện (như Kiểm tra mục tiêu đọc: không có phần suy luận, không có bước đã bị hoàn tác) đến mô hình của chính cuộc trò chuyện và hiện ghi chú bàn giao; chỉ **Bắt đầu cuộc trò chuyện mới** mới tạo cuộc trò chuyện mới. Không có gì được ghi vào dự án.
199
200
  - **Phân tích ngữ cảnh:** phần Host chỉ đọc nhật ký cuộc trò chuyện; không gọi mô hình, không đọc tệp dự án.
200
201
  - **Bảng tác vụ:** bảng hiện các cuộc trò chuyện của chính dsh từ các danh sách của chính dsh trong cửa sổ này; bảng không thêm dữ liệu trò chuyện riêng nào. **Tác vụ mới** mở cuộc trò chuyện mới của chính dsh, và bạn viết tin nhắn đầu tiên trong khung soạn thảo của dsh, nên phê duyệt, sandbox và mô hình của cuộc trò chuyện áp dụng như bình thường. Phần Host giữ tin nhắn đầu tiên của cuộc trò chuyện đó làm prompt của thẻ và gửi nó (4.000 ký tự đầu tiên, không gì khác) đến mô hình của cuộc trò chuyện đó trong thêm một yêu cầu, không có công cụ, để lấy tối đa 3 nhãn. Prompt, nhãn và thời điểm bắt đầu của mỗi tác vụ được lưu trong `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (tệp chỉ chủ sở hữu truy cập được, 2.000 mục mới nhất), cùng với ID của các cuộc trò chuyện mà bạn đã gỡ khỏi bảng bằng **×** hoặc **Gỡ tất cả** (5.000 mục mới nhất); công tắc nằm trong `board-switch.json` bên cạnh. Không có gì được ghi vào thư mục dự án. **Trả lời** gửi câu trả lời của bạn đến yêu cầu đang chờ của chính dsh, giống như thẻ của chính cuộc trò chuyện. Danh sách tác vụ cũ của các phiên bản trước (`board.json`) vẫn nằm trên đĩa như cũ và không được đọc. **Tiến độ khi di chuột** đọc nhật ký của cuộc trò chuyện trên máy Mac này. Với **Nhanh (không dùng AI)** (mặc định), không có gì được gửi đi. Với **Tóm tắt bằng AI**, trong lúc hộp tiến độ của một thẻ đang chạy hiện ra (hoặc trong lúc bảng của Tether đang mở, cho tối đa 8 thẻ đang chạy), phần Host gửi phần mới nhất của cuộc trò chuyện đó (tối đa khoảng 6.000 ký tự: tin nhắn của bạn, câu trả lời dạng văn bản của tác tử, các lệnh gọi công cụ và phần cuối kết quả của chúng; không có phần suy luận hay tin nhắn đã bị hoàn tác) đến mô hình của cuộc trò chuyện, trong một yêu cầu không dùng công cụ. Phần Host chỉ gửi lại sau khi cuộc trò chuyện có bước mới, tối đa một lần mỗi 20 giây cho mỗi cuộc trò chuyện. Ghi chú chỉ được giữ trong bộ nhớ; thiết lập nằm trong `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (tệp chỉ chủ sở hữu truy cập được).
202
+ - **Trợ lý:** cuộc trò chuyện trợ lý là một cuộc trò chuyện dsh bình thường trong `~/Assistant`; các lệnh gọi mô hình của nó đi đến mô hình mặc định của dsh như mọi cuộc trò chuyện khác. Các công cụ của nó đọc nhật ký các cuộc trò chuyện khác của bạn trên máy Mac này (tiêu đề, dự án, trạng thái và, với chat_read, các tin nhắn mới nhất) và chỉ đưa chúng cho mô hình đó khi mô hình gọi một công cụ. Gửi tin nhắn đến cuộc trò chuyện, bắt đầu, dừng và lưu trữ cuộc trò chuyện đều chờ bạn phê duyệt. ID cuộc trò chuyện được lưu trong `$DSH_HOME/storages/dsh-composer-plus/assistant.json` và công tắc trong `assistant-switch.json` (tệp chỉ chủ sở hữu truy cập được). Lời nhắc và tự động hóa là các tác vụ theo lịch của chính dsh. Không có gì rời khỏi máy Mac này ngoài các yêu cầu mô hình và các lần tìm kiếm web mà cuộc trò chuyện thực hiện.
201
203
  - **Tệp được bảo vệ:** danh sách và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc đường dẫn của mỗi lệnh gọi công cụ tệp (và đường dẫn thật của nó), không bao giờ đọc tệp.
202
204
  - **Lệnh bị chặn:** các quy tắc và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc văn bản lệnh của mỗi lệnh gọi `bash` và `pwsh`; nó không chạy gì và không gửi gì.
203
205
  - **Nhập giá trị bí mật:** giá trị chỉ đi từ thẻ (hoặc từ Tether, qua gateway không ghi lại nội dung yêu cầu) đến Host trong yêu cầu trả lời. Host ghi nó vào `$DSH_HOME/storages/dsh-composer-plus/secrets/<tên ngẫu nhiên>` (thư mục 0700, tệp 0600); không có gì vào dự án, nhật ký trò chuyện hay kết quả công cụ. Host giữ giá trị trong bộ nhớ để thay nó bằng `[secret]` trong các kết quả công cụ sau đó của cuộc trò chuyện. Tệp và bản sao này bị xóa khi lượt của cuộc trò chuyện kết thúc và khi dsh khởi động. Công tắc nằm trong `secrets.json` bên cạnh. Một lệnh mà agent chạy với tệp có thể gửi giá trị đến nơi lệnh đó gửi: đó là mục đích của nó.
@@ -224,7 +226,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
224
226
  - **Dòng cuộc trò chuyện không có nhãn branch:** thanh bên không ở chế độ xem “Trong một danh sách” (trong “Không gian làm việc” và “Cây không gian làm việc”, không dòng cuộc trò chuyện nào hiển thị nhãn), cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
225
227
  - **Kiểm tra mục tiêu báo bài kiểm thử thoát với mã 127 hoặc "not found":** dsh khởi động từ Finder hoặc Dock có thể có PATH ngắn hơn terminal của bạn, nên không tìm thấy `npm`, `pnpm` hoặc `cargo`. Hãy khởi động dsh từ terminal, hoặc đặt lệnh kiểm thử của riêng bạn với đường dẫn đầy đủ trong **Kiểm tra mục tiêu** → **Sửa**. **Chạy ngay** hiện kết quả ngay lập tức.
226
228
  - **Mục tiêu không đóng và tác tử tiếp tục làm việc:** **Kiểm tra mục tiêu** đã tìm thấy một bài kiểm thử thất bại hoặc phần việc còn thiếu; dòng bên dưới mục tiêu cho biết lý do (di chuột lên kết quả để xem chi tiết). Hãy sửa nguyên nhân hoặc lệnh kiểm thử, hoặc tự hoàn tất mục tiêu bằng `/goal` hoặc thanh mục tiêu (việc này không được kiểm tra).
227
- - **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.23.0`), xem ghi chú cài đặt ở trên.
229
+ - **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.24.0`), xem ghi chú cài đặt ở trên.
228
230
  - **Sao lưu ngay báo "Một thao tác sao lưu khác đang chạy":** một thao tác đang chạy trong cửa sổ dsh khác hoặc trong bảng điều khiển cứu hộ (chúng dùng chung tệp khóa `.composer-plus.lock` trong thư mục sao lưu). Hãy chờ thao tác đó xong. Nếu không có thao tác nào đang chạy, khóa của tiến trình đã đóng sẽ được tiếp quản ở lần nhấp tiếp theo.
229
231
  - **Bảng điều khiển cứu hộ báo "dsh is running":** trước tiên hãy thoát dsh. Nếu dsh thật sự đã đóng, tệp được nêu trong thông báo là phần còn sót lại sau một sự cố: hãy xóa tệp đó rồi thử lại.
230
232
  - **Sau khi khôi phục, dsh không khởi động hoặc thiếu một plugin:** cần cài lại các gói plugin của profile. Bảng điều khiển cứu hộ đề nghị việc này sau khi khôi phục; hoặc chạy `pnpm install` trong từng thư mục dưới `$DSH_HOME/profiles/` mà nó liệt kê. Các thông tin bí mật không có trong vault (máy tính khác) phải được nhập lại: bảng điều khiển liệt kê chúng.
@@ -258,7 +260,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
258
260
  - **Vừa thẻ câu hỏi với cửa sổ** chỉ thay đổi thẻ câu hỏi của dsh, không thay đổi thẻ duyệt kế hoạch. Tính năng tìm thẻ qua mã đánh dấu của dsh (`data-question-key`, `data-question-scroll`); nếu một bản cập nhật dsh thay đổi mã đánh dấu đó, thẻ hiển thị như dsh vẽ. Chiều cao của thẻ theo cửa sổ, không theo cuộc trò chuyện: trong một cuộc trò chuyện ở bảng bên hẹp, một thẻ cao vẫn có thể vượt lên trên cuộc trò chuyện.
259
261
  - **Vừa tiêu đề cuộc trò chuyện với cửa sổ** tìm tiêu đề cuộc trò chuyện của dsh qua các tên lớp do dsh tạo (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), vì dsh không có điểm móc bố cục cho nó. Nếu bản cập nhật dsh đổi các tên này, tiêu đề hiển thị như dsh vẽ. Trong cột trò chuyện rất hẹp, tiêu đề có thể chiếm hai hoặc ba dòng, nên vùng phía trên tin nhắn thấp hơn.
260
262
  - **Kết nối di động** chỉ hoạt động trên macOS (dùng `en0`, `openssl`, `swift` và `dns-sd`). Tính năng dùng cố định cổng 19390 và 19391, nên trên mỗi máy Mac, mỗi lúc chỉ một dsh có thể chạy tính năng này (mỗi máy Mac là một mục trong danh sách Mac của điện thoại). Khi có khóa APNs trong `apns.json` (xem `tether/README.md`), Mac gửi thông báo qua dịch vụ push của Apple, nên thông báo vẫn đến khi Tether đã đóng; Mac phải đang thức và mở dsh. Nếu không có khóa, điện thoại chỉ nhận thông báo khi Tether đang mở hoặc vừa chuyển sang chạy nền. Tether chỉ gửi thông báo sau khi bạn bật "Settings → Notifications → Send notifications" trong Tether. Tether lưu tùy chọn này và khung giờ của nó riêng cho từng máy Mac đã ghép nối. Tùy chọn này tắt theo mặc định trên mỗi máy Mac, và iOS hỏi quyền khi bạn bật nó. Ứng dụng iOS chưa có trên App Store: hãy build ứng dụng từ `tether/ios` bằng Xcode. "Tailscale only" vẫn cần máy Mac có địa chỉ Wi-Fi hoặc Ethernet (gateway chỉ khởi động khi có địa chỉ đó). Nhật ký truy cập là riêng cho từng máy Mac và chỉ giữ 200 lần thử mới nhất; một lần thử lặp lại trong vòng một phút sẽ tăng số đếm của cùng một dòng thêm một. Khóa ứng dụng của Mỗi thông báo hiện Mac và dự án của cuộc trò chuyện (`Studio Mac · recipe-box`), tiêu đề cuộc trò chuyện và nội dung: Turn finished hiện câu trả lời cuối cùng của agent. Khi có khóa APNs, nội dung này đi qua dịch vụ push của Apple. Tether không ẩn bản xem trước thông báo trên Màn hình khóa của iPhone: hãy tắt chúng trong Cài đặt của iOS. Chấm xanh trong Tether theo Mac: cuộc trò chuyện bạn mở trong dsh cũng mất chấm trên điện thoại. Cuộc trò chuyện bạn mở trong Tether chỉ mất chấm trên điện thoại. Chấm riêng của dsh trên Mac vẫn còn cho đến khi bạn mở cuộc trò chuyện đó trên Mac.
261
- - **Máy tính từ xa** cần Tailscale trên cả hai máy Mac, và cần Composer Plus có bật tính năng này trên máy Mac mà bạn mở. Máy Mac đó không được ở chế độ ngủ, và dsh phải đang chạy trên máy. Bộ chọn chỉ hiện khi thanh bên trái đang mở (không hiện khi thanh bên chỉ còn các biểu tượng). Trang của máy Mac kia chỉ hiện bộ chọn khi máy đó có phiên bản Composer Plus này hoặc mới hơn. Với phiên bản cũ hơn, nút **Quay lại máy Mac này** hiện ở trên cùng sau vài giây. Mỗi máy tính bạn đã mở giữ trang của nó trong bộ nhớ cho đến khi bạn tắt tính năng hoặc khởi động lại dsh. Trên ứng dụng desktop, trang của máy Mac kia là một trang nhúng: các phím tắt của chính dsh (ví dụ cuộc trò chuyện mới) không hoạt động trong trang đó, và việc tải tệp xuống, micrô và thông báo cũng không hoạt động ở đó. Tính năng dùng cổng 19392 (trên mỗi máy Mac, chỉ một dsh có thể cho máy tính khác vào). Từ trang của một máy Mac khác, bộ chọn chỉ chuyển giữa các máy tính của máy Mac này: bạn không thể mở máy Mac thứ ba thông qua máy Mac kia.
263
+ - **Máy tính từ xa** cần Tailscale trên cả hai máy Mac, và cần Composer Plus có bật tính năng này trên máy Mac mà bạn mở. Máy Mac đó không được ở chế độ ngủ, và dsh phải đang chạy trên máy. Bộ chọn chỉ hiện khi thanh bên trái đang mở (không hiện khi thanh bên chỉ còn các biểu tượng). Nếu trang của máy Mac kia không có bộ chọn riêng (Composer Plus ở đó cũ hơn 1.23.0), bộ chọn của máy Mac này hiện phía trên trang đó ở cùng vị trí. Nếu ở đó là 1.23.0, bộ chọn hiện tên của máy Mac kia: chọn **Máy Mac này** trong menu của nó để quay lại. Mỗi máy tính bạn đã mở giữ trang của nó trong bộ nhớ cho đến khi bạn tắt tính năng hoặc khởi động lại dsh. Trên ứng dụng desktop, trang của máy Mac kia là một trang nhúng: các phím tắt của chính dsh (ví dụ cuộc trò chuyện mới) không hoạt động trong trang đó, và việc tải tệp xuống, micrô và thông báo cũng không hoạt động ở đó. Tính năng dùng cổng 19392 (trên mỗi máy Mac, chỉ một dsh có thể cho máy tính khác vào). Từ trang của một máy Mac khác, bộ chọn chỉ chuyển giữa các máy tính của máy Mac này: bạn không thể mở máy Mac thứ ba thông qua máy Mac kia.
262
264
  - Liên kết phiên hoạt động bên trong cuộc trò chuyện; nhấp vào liên kết không mở cuộc trò chuyện. Liên kết tạo bằng **Sao chép liên kết tin nhắn** chỉ mở tin nhắn của nó trên dsh 0.2.1 trở lên, và chỉ từ một tin nhắn trong cuộc trò chuyện (dsh 0.2.0 không có quy tắc văn bản người dùng, nên ở đó liên kết vẫn được sao chép nhưng hiện dưới dạng văn bản thường). Tin nhắn mà một lần hoàn tác đã đưa ra, hoặc mà việc nén đã xóa khỏi lịch sử dsh tải, không thể hiển thị: khi đó liên kết sẽ báo như vậy. Các nút 🔗 gắn vào các dòng tin nhắn của dsh; nếu một bản cập nhật dsh thay đổi markup đó, các nút không hiện.
263
265
  - **Đánh dấu tất cả là đã đọc** thay đổi các chấm chưa đọc của chính dsh qua một phần của dsh không phải API công khai (danh sách `completionUnread` trong trạng thái phiên của dsh). Nếu một bản cập nhật dsh đổi tên phần này, mục không hiện. Mục được đặt trong menu "…" của dự án trong dsh, và menu này không có vị trí dành cho plugin; nếu dsh thay đổi menu đó, mục cũng không hiện.
264
266
  - **Sửa tin nhắn trong hàng đợi tại chỗ** không thay đổi tin nhắn đã bắt đầu được gửi trong lúc đó, và không ghi đè tin nhắn đã thay đổi trong lúc đó (ví dụ trong Tether trên iPhone): một thông báo cho biết điều này. Hình ảnh mới cần một mô hình nhận hình ảnh (các giới hạn hình ảnh của chính dsh vẫn áp dụng), và tệp mới phải tải lên xong thì mới lưu được. Chỉ sửa được tin nhắn trong hàng đợi của chính bạn: không sửa được một vòng mục tiêu hoặc một câu trả lời cho câu hỏi trong hàng đợi. Sau khi cập nhật plugin, chỉ việc sửa văn bản hoạt động ngay: hãy khởi động lại dsh trước khi lưu tin nhắn có hình ảnh hoặc tệp (phần Host được tải khi khởi động).
@@ -294,6 +296,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
294
296
  - **Gói skill tiếng Thổ Nhĩ Kỳ** cài một skill của bên thứ ba: các quy tắc đến từ kho GitHub của tác giả, không phải từ Composer Plus, và phiên bản mới được dùng từ lần kiểm tra hằng ngày tiếp theo mà chúng tôi không xem xét. Việc kiểm tra chỉ chứng minh các tệp đúng là những tệp GitHub liệt kê cho commit đó, không chứng minh các quy tắc là tốt. Mô hình quyết định khi nào tải skill (bạn cũng có thể gọi nó theo tên); các quy tắc chỉ áp dụng cho văn bản tiếng Thổ Nhĩ Kỳ. Phần Host dùng ngôn ngữ mà một trình duyệt báo gần nhất: khi hai trình duyệt dùng ngôn ngữ khác nhau, báo mới nhất được dùng. Khi chưa đăng nhập, GitHub chỉ cho 60 lệnh gọi API mỗi giờ; một lần kiểm tra bị từ chối vẫn giữ bản sao đã cài và hiện lý do trong Cài đặt.
295
297
  - **Gỡ rối codebase** đi kèm một bản sao cố định của skill (caldoai/skills, commit f3cf477): thay đổi ở bản gốc chỉ đến cùng phiên bản Composer Plus mới. Skill chạy một mục tiêu dài có thể thay đổi nhiều tệp, và các tác tử con cùng bước kiểm tra của nó tốn nhiều token. Ở những phần dự án không có kiểm thử, nó có thể thay đổi hành vi mà bạn không biết: hãy khởi động trên một branch riêng và đọc diff trước khi merge. Skill cùng tên trong dự án, trong thư mục skill tùy chỉnh hoặc trong `~/.dsh/skills` sẽ thay thế nó. Khi công tắc tắt, `/untangle-codebase` được gửi tới mô hình như văn bản thường.
296
298
  - **Bảng tác vụ** hiện các cuộc trò chuyện mà dsh liệt kê trong cửa sổ này: cuộc trò chuyện nằm ngoài dự án chỉ hiện trong **Tất cả dự án**, và thư mục branch riêng của từng cuộc trò chuyện (`<project>/.worktrees/<name>`) được tính là thuộc dự án của nó. Cột của một thẻ là trạng thái trực tiếp của cuộc trò chuyện, nên không thể kéo thẻ: cuộc trò chuyện chuyển sang **Xong** khi lượt của nó kết thúc, kể cả sau lỗi hoặc khi bị dừng, và quay lại **Đang làm** khi chạy lại. Chấm xanh lá là chấm hoàn tất của chính dsh, mà dsh chỉ giữ trong cửa sổ này: sau khi trang được tải lại, các cuộc trò chuyện đã xong hiện không có chấm này. **Xong** hiện 50 cuộc trò chuyện mới nhất (**Hiện N tác vụ cũ hơn** hiện phần còn lại). **Tìm dự án** chỉ tìm dự án theo tên, không theo đường dẫn thư mục. **Hoạt động trong 2 giờ qua** ẩn một dự án khi mọi cuộc trò chuyện của nó đều cũ hơn 2 giờ, không hoạt động và đã đọc; bảng vẫn hiện dự án mà bạn đã chọn. **Tác vụ mới** chỉ nhớ cuộc trò chuyện mới gần nhất của cửa sổ này: khi bạn mở một cuộc trò chuyện khác trước tin nhắn đầu tiên, cuộc trò chuyện đó vẫn ở trên cùng của **Đang làm** dưới tên **Tác vụ mới** cho đến khi bạn viết vào, nhưng bảng chỉ tự quay lại cho cuộc trò chuyện gần nhất. Sau khi tải lại, cuộc trò chuyện mới chưa có tin nhắn không có trên bảng (dsh giữ nó làm Phiên mới trống của dsh). Nhãn đến từ một lệnh gọi mô hình cho mỗi tác vụ, dựa trên tin nhắn đầu tiên của tác vụ: nhãn có thể sai, và cuộc trò chuyện mà bạn không bắt đầu trên bảng thì không có nhãn. Tiêu đề là tiêu đề cuộc trò chuyện của chính dsh (dịch vụ đặt tiêu đề của dsh, với mô hình của cuộc trò chuyện); cho đến khi có tiêu đề, thẻ hiện dòng đầu tiên của tin nhắn đầu tiên. **×** và **Gỡ tất cả** chỉ gỡ thẻ khỏi bảng: không cuộc trò chuyện nào bị xóa. **Hoàn tác** chỉ hiện trong 8 giây, trong cửa sổ này; sau đó, **Đã gỡ (N)** → **Đưa lại lên bảng** đưa một thẻ trở lại, và cuộc trò chuyện chạy lại sẽ tự quay lại. **Gỡ tất cả** hỏi trước rồi gỡ các thẻ đã xong và đã đọc của dự án đang hiện (của mọi dự án với **Tất cả dự án**), kể cả các thẻ nằm sau **Hiện N tác vụ cũ hơn**; thẻ chưa đọc (màu xanh lá) vẫn ở lại. dsh chỉ giữ chấm xanh lá trong cửa sổ này, nên sau khi tải lại, Gỡ tất cả có thể gỡ một thẻ mà bạn chưa đọc câu trả lời. Danh sách được lưu trên máy Mac này cho mọi cửa sổ và cho Tether; khi danh sách có 5.000 cuộc trò chuyện, các cuộc trò chuyện cũ nhất sẽ quay lại. **Trả lời** chỉ trả lời yêu cầu mới nhất của cuộc trò chuyện: khi yêu cầu đó đã được trả lời ở nơi khác (cửa sổ khác, Tether, Đánh giá tự động) hoặc cuộc trò chuyện hỏi điều mới, khung chi tiết báo điều đó và không gửi gì. Các phiên bản trước có danh sách tác vụ với bình luận và công cụ cho tác tử; chúng đã bị bỏ, và `board.json` cũ không được hiển thị. Ý tưởng và giao diện lấy từ [Kanzo](https://github.com/emanuele-em/kanzo) của emanuele-em (AGPL-3.0); Composer Plus không dùng mã của nó. `Cmd+Shift+K` là phím tắt của dsh: trong trình duyệt trên Linux, nó không có phím mặc định (hãy đặt trong trang phím tắt của dsh), và tiện ích trình duyệt hoặc ứng dụng khác có thể dùng phím này trước. Một thẻ rời **Xong** khi chấm xanh lá của dsh biến mất (bạn đã mở cuộc trò chuyện), hoặc với cuộc trò chuyện xong phía sau bảng khi nó là cuộc trò chuyện đang mở, khi cuộc trò chuyện đó hiện ra mà không có bảng điều khiển nào phía trên. Trạng thái đã đọc này chỉ có trong cửa sổ dsh này, như các chấm của dsh: sau khi tải lại hoặc trong cửa sổ khác, mọi cuộc trò chuyện đã xong đều được tính là đã đọc, nên nằm trong **Vừa xong**.
299
+ - **Trợ lý** có một cuộc trò chuyện cho tất cả cửa sổ trên máy Mac này. Trợ lý chạy với chế độ quyền workspace-write: chỉ ghi tệp trong `~/Assistant`, và một lệnh bên ngoài thư mục đó sẽ hỏi trước. Khi bạn chuyển cuộc trò chuyện sang chế độ không cần phê duyệt (Toàn quyền), dsh từ chối mọi yêu cầu phê duyệt, nên trợ lý không thể gửi tin nhắn đến, bắt đầu, dừng hoặc lưu trữ cuộc trò chuyện. Thẻ phê duyệt chỉ bảo vệ sáu công cụ đó: lệnh shell của trợ lý vẫn có thể truy cập mạng, như trong mọi cuộc trò chuyện ở chế độ đó. Trên dsh 0.2.0 và 0.2.1, các công cụ lịch của dsh chỉ thấy lời nhắc của chính cuộc trò chuyện trợ lý, không thấy tác vụ tự động của các cuộc trò chuyện khác; từ dsh 0.2.2, chúng liệt kê và thay đổi mọi tác vụ theo lịch. chats_list bỏ qua các cuộc trò chuyện đã lưu trữ, trống và subagent, cùng chính cuộc trò chuyện trợ lý; “đang chờ bạn” nghĩa là một cuộc trò chuyện đang chạy có yêu cầu phê duyệt, câu hỏi hoặc xem xét kế hoạch đang mở. chat_read trả về tin nhắn của người dùng và câu trả lời của tác tử (không có đầu ra công cụ), tối đa 50 tin nhắn và khoảng 24.000 ký tự. chat_archive từ chối cuộc trò chuyện vẫn đang chạy hoặc còn lời nhắc đang hoạt động. Mô hình vẫn có thể bị đánh lừa bởi văn bản mà nó đọc: thẻ phê duyệt là bước kiểm tra cuối cùng, nên hãy đọc thẻ trước khi bạn nhấp **Cho phép một lần**.
297
300
  - **Ưu tiên tin nhắn gửi sau khi Dừng** chỉ hoạt động sau khi bạn dừng cuộc trò chuyện (hoặc sau một lượt bị lỗi, hoặc khi bạn mở một cuộc trò chuyện vẫn còn hàng đợi): tin nhắn bạn gửi khi một lượt đang chạy vẫn chờ ở cuối hàng đợi. Nó chỉ vượt lên trước các tin nhắn của chính bạn trong hàng đợi: nếu trong hàng đợi có một vòng mục tiêu hoặc một câu trả lời cho câu hỏi đang chờ, thứ tự của dsh được giữ nguyên. Nó đọc một phần của dsh không phải là API công khai (lượt đã dừng có còn đang kết thúc không); nếu một bản cập nhật dsh đổi tên phần đó, tin nhắn chỉ được đưa lên đầu sau khi lượt đó kết thúc. Cuộc trò chuyện của subagent giữ thứ tự của dsh.
298
301
  - **Bộ nhớ dự án** thuộc về thư mục đầu tiên của cuộc trò chuyện (thư mục dự án của dsh): cuộc trò chuyện đổi thư mục bằng `cd` vẫn giữ bộ nhớ của dự án đầu tiên, và cùng thư mục được mở qua một đường dẫn khác tới cùng các tệp sẽ dùng chung bộ nhớ. Cuộc trò chuyện cố định phần bộ nhớ khi bắt đầu, nên ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo (`memory_recall` tìm thấy ngay). Việc xem xét chỉ giữ những gì mô hình quyết định giữ: có thể bỏ sót một dữ kiện hoặc giữ một dữ kiện sai; hãy kiểm tra trong **Mở bộ nhớ** và sửa ở đó, hoặc sửa các tệp bằng tay khi dsh đã đóng. **Mở bộ nhớ** gửi ghi chú của dự án được chọn và ghi chú chung (mọi dự án khi bạn chọn Tất cả ghi chú; tối đa khoảng 60.000 ký tự, phần còn lại chỉ được đếm và không thể thay đổi trong yêu cầu đó) cùng văn bản của bạn tới mô hình mặc định của dsh, không phải mô hình của cuộc trò chuyện. Bản xem trước được giữ trên Mac trong 30 phút và cho đến khi dsh khởi động lại; nếu việc xem xét hoặc tác tử thay đổi ghi chú trong lúc đó, **Áp dụng** sẽ từ chối và bạn xem trước lại. **Áp dụng** lưu tất cả thay đổi của một bản xem trước hoặc không lưu gì: nếu một thay đổi không lưu được (ví dụ MEMORY.md đã đầy), ghi chú giữ nguyên và lý do được hiển thị. Mỗi lượt kết thúc có tin nhắn của bạn tốn một lần gọi mô hình; lần gọi thất bại sẽ đọc lại cùng các tin nhắn sau lượt tiếp theo. Cuộc trò chuyện của tác tử con không được xem xét. Ý tưởng và định dạng tệp lấy từ [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus không dùng mã của nó và không bao giờ đọc hay ghi bộ nhớ riêng của DS Bot.
299
302
  - **Lịch sử phiên bản bộ nhớ** giữ 50 phiên bản mới nhất của mỗi bộ nhớ (mỗi dự án và bộ nhớ chung); các bản cũ hơn bị xóa. Một phiên bản chứa toàn bộ bộ nhớ của dự án đó, không phải một ghi chú. **Khôi phục** đặt lại mọi tệp của phiên bản đó (kể cả chủ đề) và từ chối khi bộ nhớ đã thay đổi sau khi bạn mở phiên bản; bộ nhớ trước khi khôi phục trở thành một phiên bản mới, nên bạn có thể hoàn tác. Khi công tắc tắt, không giữ phiên bản mới và **Khôi phục** từ chối; các phiên bản đã giữ vẫn còn. Không có phiên bản từ trước tính năng này: lịch sử bắt đầu từ lần lưu đầu tiên sau khi cài đặt.
@@ -347,6 +350,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
347
350
 
348
351
  **Tôi có thể xem tất cả cuộc trò chuyện của mình dưới dạng bảng kanban và bắt đầu cuộc trò chuyện mới từ đó không?** Có, với **Bảng tác vụ** (mặc định bật): mở nó ở thanh bên trái. Mỗi cuộc trò chuyện là một thẻ trong **Đang làm**, **Đang duyệt** (đang chờ bạn) hoặc **Xong**. **Tác vụ mới** mở cuộc trò chuyện mới của dsh trong dự án, và bảng quay lại khi tin nhắn đầu tiên của bạn được gửi; nhấp **Trả lời** trên thẻ màu cam để trả lời mà không cần mở cuộc trò chuyện. **Gỡ tất cả** ở **Xong** hỏi trước rồi gỡ khỏi bảng các thẻ đã xong mà bạn đã đọc; **Hoàn tác** và **Đã gỡ (N)** đưa chúng trở lại, và các cuộc trò chuyện vẫn còn trong dsh.
349
352
 
353
+ **Tôi có thể có một cuộc trò chuyện trợ lý cá nhân nhắc việc cho tôi và quản lý các cuộc trò chuyện khác của tôi không?** Có, với **Trợ lý** (mặc định tắt): bật trong Cài đặt → Composer Plus, rồi nhấp **Trợ lý** ở thanh bên trái. Trợ lý đặt lời nhắc bằng các tác vụ theo lịch của dsh, tìm kiếm trên web, liệt kê và đọc các cuộc trò chuyện của bạn, và chỉ gửi tin nhắn đến một cuộc trò chuyện hoặc bắt đầu, dừng hay lưu trữ một cuộc trò chuyện sau khi bạn phê duyệt. Hãy lưu hồ sơ của bạn trong bộ nhớ dự án của nó, chủ đề “profil”.
354
+
350
355
  **dsh có thể sao lưu các cuộc trò chuyện và cài đặt của tôi như dsh-backup không?** Có: **Cài đặt → Composer Plus → Sao lưu → Sao lưu ngay**. Nó ghi cùng định dạng tệp lưu trữ vào cùng thư mục (`~/Desktop/dsh-backups`), nên các tệp lưu trữ của dsh-backup cũng hiện ra và khôi phục được, và bạn có thể gỡ dsh-backup. Bật **Tự động sao lưu** để sao lưu theo lịch.
351
356
 
352
357
  **dsh không khởi động được nữa. Làm sao để khôi phục một bản sao lưu?** Mở thư mục sao lưu (`~/Desktop/dsh-backups`) và nhấp đúp vào `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Chọn `3) Restore a backup`, chọn một bản sao lưu rồi gõ `RESTORE`. Cách này chạy được mà không cần dsh.
@@ -389,7 +394,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
389
394
 
390
395
  **Tôi bị mất iPhone. Làm sao để chặn nó truy cập máy Mac của tôi?** Nhấp **Kết nối di động** ở góc dưới bên trái thanh bên, rồi nhấp **Remove** bên cạnh iPhone đó. Khóa của iPhone đó ngừng hoạt động ngay; nó chỉ có thể kết nối lại bằng một lần ghép nối mới mà bạn phê duyệt trên máy Mac.
391
396
 
392
- **Làm sao để tiếp tục một cuộc trò chuyện của máy Mac kia trên máy Mac này?** Trên máy Mac kia, bật **Cài đặt → Composer Plus → Máy tính từ xa** và **Cho phép máy tính khác mở máy Mac này**, nhấp **Tạo liên kết ghép nối** và sao chép liên kết (gửi cho chính bạn, ví dụ bằng AirDrop hoặc Ghi chú). Trên máy Mac này, cũng bật **Máy tính từ xa**, chọn **Thêm máy tính…** trong bộ chọn ở thanh bên trái (bên phải tên thương hiệu, phía trên **Phiên mới**), dán liên kết, nhập **Tên** và nhấp **Kết nối**. Sau đó nhấp **Phê duyệt** trên máy Mac kia. Từ đó trở đi, chọn máy tính đó trong cùng menu: máy đó lấp đầy cửa sổ này. Chọn **Máy Mac này** ở cùng vị trí để quay lại. Trong lúc đó, các cuộc trò chuyện của máy Mac này vẫn tiếp tục chạy.
397
+ **Làm sao để tiếp tục một cuộc trò chuyện của máy Mac kia trên máy Mac này?** Trên máy Mac kia, bật **Cài đặt → Composer Plus → Máy tính từ xa** và **Cho phép máy tính khác mở máy Mac này**, nhấp **Tạo liên kết ghép nối** và sao chép liên kết (gửi cho chính bạn, ví dụ bằng AirDrop hoặc Ghi chú). Trên máy Mac này, cũng bật **Máy tính từ xa**, chọn **Thêm máy tính…** trong bộ chọn ở thanh bên trái (bên phải tên thương hiệu, phía trên **Phiên mới**), dán liên kết, nhập **Tên** và nhấp **Kết nối**. Sau đó nhấp **Phê duyệt** trên máy Mac kia. Từ đó trở đi, chọn máy tính đó trong cùng menu: máy đó lấp đầy cửa sổ này. Nhấp **Quay lại máy Mac này** ở cùng vị trí để quay lại. Trong lúc đó, các cuộc trò chuyện của máy Mac này vẫn tiếp tục chạy.
393
398
 
394
399
  **Có thể khóa Tether bằng Face ID không?** Có: trong Tether, bật "Settings → Privacy → Lock with Face ID". Sau đó, Tether yêu cầu Face ID (hoặc mật mã) khi mở và khi bạn quay lại ứng dụng.
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh
package/README.zh.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  然后重启 dsh。(CLI 无法安装到桌面版 profile 中;桌面版 profile 由应用自己管理。)
31
31
 
32
- > dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.23.0`。
32
+ > dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.24.0`。
33
33
 
34
34
  ## 功能
35
35
 
@@ -75,6 +75,7 @@ dsh plugin --profile web add dsh-composer-plus
75
75
  | **受保护的文件** | <a id="feature-protectedfiles"></a>默认开启。智能体自己的文件工具不能读取或更改与你的模式匹配的文件:对于 **读取和写入** 模式,对文件使用的 `read`、`read_image` 和 `grep` 会被拒绝;两种模式下 `write`、`edit` 和 `str_replace_editor` 都会被拒绝。智能体会看到原因,并被告知要问你。默认模式是 `.env*`、`*.pem` 和 `*.key`。设置 → Composer Plus → **受保护的文件**:添加一个模式(例如 `published/**` 或 `config/*.yml`),点击它的类型可在 **读取和写入** 与 **仅写入** 之间切换,用 ✕ 移除它,或点击 **使用默认值**。不含 `/` 的模式会匹配任意文件夹中的文件名。这是护栏,不是沙箱:shell 命令(`cat .env`)、脚本或 MCP 工具仍能访问该文件(见“限制”)。 | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="截图:受保护的文件"></a> |
76
76
  | **禁止的命令** | <a id="feature-blockedcommands"></a>默认开启,列表为空。智能体的 shell 命令(`bash`、`pwsh`)不能运行与你的规则匹配的命令:**阻止** 规则会拒绝调用(智能体会看到原因,并被告知要问你),**先询问** 规则会显示 dsh 的审批卡片,只有你允许后命令才会运行。设置 → Composer Plus → **禁止的命令**:输入一条规则(例如 `npm publish`、`git push --force` 或 `ssh *192.168.2.19`),点击类型可在 **阻止** 与 **先询问** 之间切换,然后点击 **添加**;点击规则的类型可以更改它,用 ✕ 移除它。一条规则是一个命令名和必须按此顺序出现在它后面的词;`*` 匹配任意文本。它也能找到 `&&`、`;`、`\|` 之后,`$(…)`、`bash -c "…"` 或 `eval` 之中,以及 `sudo` 或 `env` 之后的命令。这是护栏,不是沙箱:变量(`$CMD`)、脚本文件或其他程序仍能运行该命令(见“限制”)。 | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="截图:禁止的命令"></a> |
77
77
  | **任务看板** | <a id="feature-taskboard"></a>左侧边栏 → **任务看板**,或在 dsh 的任意位置按 `Cmd+Shift+K`(Windows 和 Linux 上为 `Ctrl+Shift+K`)。dsh 对话的看板,显示与侧边栏相同的实时状态:等待你审批、回答或审阅计划的对话在**审核**中并带橙色圆点,运行中的对话在**进行中**,尚未打开的已完成对话在**已完成**中(绿色)。打开对话后,它的卡片会自动离开**已完成**;点击绿色卡片下方的**最近完成 (N)**,可查看你已读的已完成对话(最新 10 个,然后是**显示更早的 N 个**;展开或收起状态保存在此设备上)。在看板后面打开着时完成的对话(**新建任务**)会保持绿色,直到你打开它。点击看板顶部的项目名称打开项目列表,然后选择一个项目或**所有项目**;“每个对话一个分支”的文件夹算作它所属的项目。选择后、按 `Esc` 或点击列表外部时,列表会关闭。在列表顶部的**搜索项目**中输入,可按名称查找项目(不区分大小写和重音符号;按 `Esc` 清空搜索框),按 `Enter` 选择第一个匹配项;点击**最近 2 小时内活跃**,则只显示有对话正在等待、正在运行、已完成但尚未查看,或在最近 2 小时内有变化的项目(此设置保存在此设备上)。**新建任务**(或按 `n`)会在看板显示的项目中打开 dsh 自己的新对话(选择**所有项目**时,在 dsh 的新会话所选的项目中打开),因此你可以像在任何对话中一样添加文件、使用命令和选择模型。你的第一条消息发出后,会自动回到看板。在此之前,该对话以**新建任务**显示在**进行中**的最上方:点击它即可写第一条消息。有对话在等待你的项目,在项目列表中带橙色圆点(有任何对话在等待时,顶部的项目名称旁也有橙色圆点)。dsh 为对话命名,对话的模型根据这条消息最多写出 3 个标签。点击卡片可打开它的对话。点击橙色卡片(或其上的**回答**),即可直接在看板上回答;面板中的**打开对话**可打开完整对话:**拒绝**或**允许一次**;计划则选**同意执行**或**要求修改**;问题则选择选项或输入你自己的文字。点击已完成卡片上的 **×**,可把这张卡片从看板移除;展开**最近完成**后点击**已完成**顶部的**全部清除**,可把这些卡片从看板移除:它会先显示将移除哪个项目的多少张卡片,未读(绿色)卡片会保留。之后 8 秒内,**撤销**可把卡片放回;**已完成**下方的**已移除 (N)**列出已从看板移除的卡片,**放回**可让其中一张重新显示在**已完成**中。不会删除任何对话:对话仍保留在 dsh 的侧边栏中,重启后看板仍会记住这些操作(Tether 显示同一个看板),再次运行的对话会回到看板上。将指针指向**进行中**里的卡片(或把键盘焦点移到卡片上),即可看到它的进度:运行了多久、待办列表中的当前步骤、正在运行的工具,以及智能体的最后一行。在设置 → Composer Plus → 任务看板中,**悬停显示进度**可选择**快速(不用 AI)**(默认:只读取对话)或 **AI 摘要**(再向对话的模型发送一次简短调用,额外写出一两句话)。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="截图:任务看板"></a> |
78
+ | **助理** | <a id="feature-assistant"></a>默认关闭:在 **设置 → Composer Plus** 中打开。然后点击左侧边栏中的 **助理**(就在 **任务看板** 下方):它会打开一个长期保留的对话,你可以像使用 ChatGPT 或 Grok 那样把它当作个人助理。第一次点击会创建文件夹 `~/Assistant`,将其添加为项目“Assistant”,并以 workspace-write 权限模式和 dsh 的默认模型开始对话;之后每次点击都会打开同一个对话(已归档的会恢复,已删除的会重新创建)。让它提醒你(“2 分钟后提醒我喝水”):它使用 dsh 的定时任务,所以到时会运行这个对话;打开 Mobile connect 时,Tether 会发送 “Turn finished” 通知。让它搜索网页,或询问你的其他对话:它可以列出所有项目的对话(运行中、等待你或空闲),并读取某个对话的最新消息。它还可以向某个对话发送消息、在项目中新建对话、停止正在运行的对话或归档对话:这四种操作都会先显示 dsh 的审批卡片(Tether 中也会显示),在你点击 **允许一次** 之前不会执行任何操作。它没有删除工具。只有这个对话拥有这些工具和它的简短说明;它从网页或其他对话中读到的文本只被当作数据,而不是命令。请把你的个人资料保存在该项目的记忆中(**项目记忆**,主题“profil”),不必每次都告诉它。 | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="截图:助理"></a> |
78
79
  | **项目记忆** | <a id="feature-projectmemory"></a>默认关闭:请在 **设置 → Composer Plus** 中开启。每个项目文件夹都有自己的记忆,该项目之后的对话都会读取,就像 DS Bot 为每个 Bot 保存一份记忆。每个回合结束后,会用对话的模型调用一次,读取新消息(不含已回滚的消息),把你长期的偏好、决定和事实保存为简短笔记,并修改或删除旧笔记。智能体也可以自己保存、删除和搜索笔记(`memory_remember`、`memory_forget`、`memory_recall`)。笔记也可以是全局的:所有项目都会读取。新对话会在系统提示词中获得这些笔记;之后保存的笔记从下一个对话开始显示。文件是 dsh 主目录下的 Markdown(`storages/dsh-composer-plus/memory/`),绝不写入项目文件夹。 同一行的 **打开记忆** 会按项目(以及全局记忆)分组显示所有已保存的笔记,并可筛选。用你自己的话写下要修改的内容(例如“我从 yarn 换成了 pnpm”),然后点 **预览修改**:由 dsh 的默认模型提出修改,只有点 **应用** 才会保存。在 Tether 中:聊天标题菜单 → Project memory。 | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="截图:项目记忆"></a> |
79
80
  | **记忆版本历史** | <a id="feature-memoryhistory"></a>在 **项目记忆** 开启时默认开启。每次保存记忆之前(智能体、回合结束后的回顾、**打开记忆**),都会保留一份原来的笔记副本。在 **打开记忆** 中选择一个项目或 **全局记忆**,然后点 **历史**:按日期列出各个版本,以及之后是谁修改了记忆。选择一个版本,即可以差异形式查看恢复会改变什么,然后点 **恢复**。恢复前的笔记也会保留,所以可以撤销恢复。每份记忆保留最新的 50 个版本。在 Tether 中:对话标题菜单 → Project memory → History。 | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="截图:记忆版本历史"></a> |
80
81
  | **把记忆导出到 AGENTS.md** | <a id="feature-memoryexport"></a>在 **打开记忆** 中选择一个项目,然后点 **导出到 AGENTS.md**:该项目的笔记会写入其文件夹中 `AGENTS.md` 的一个标记区块,你可以提交它,并与团队和其他智能体工具共享。你会先看到差异形式的修改,只有点 **写入 AGENTS.md** 才会保存。下次导出只替换该区块。全局记忆、来源和日期不会写入。在 Tether 中:对话标题菜单 → Project memory → Export to AGENTS.md。 | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="截图:把记忆导出到 AGENTS.md"></a> |
@@ -103,7 +104,7 @@ dsh plugin --profile web add dsh-composer-plus
103
104
  | **选项按钮** | <a id="feature-optionpicks"></a>当回答以选项列表结尾(“选项”标题或加粗的“选项”行下的 1 到 9 项编号列表,也包括“下一步”以及应用各语言中的同义词)时,回答下方会为每个选项显示一个按钮。点击即把“Option N: …”连同整个选项作为你的消息发送,就像你自己输入的一样。标有“(推荐)”的选项会有标记。按钮只显示在最新的回答下,且对话空闲、输入框为空时才显示;已选择过的回答和被回退撤回的回答不显示按钮。按钮显示期间,“下一条消息预测”不会给出猜测。在智能体的提问卡片上,按 1–9 键与点击效果相同,选择对应选项(在回答输入框中无效,问题出现后的前 0.8 秒内也无效)。 | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="截图:选项按钮"></a> |
104
105
  | **应用语言** | <a id="feature-language"></a>设置 → Composer Plus → **应用语言** 可以把整个 dsh 界面切换为 Türkçe、Español、Português (Brasil)、Français、Deutsch、Русский、日本語、한국어、Bahasa Indonesia、Tiếng Việt 或 हिन्दी(见下文)。 | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="截图:应用语言"></a> |
105
106
  | **手机连接(iPhone)** | <a id="feature-mobileconnect"></a>通过 [Tether](tether/) 应用在 iPhone 上使用 dsh,可以在同一 Wi-Fi 下使用,也可以通过 [Tailscale](https://tailscale.com) 使用。请在 **设置 → Composer Plus** 中开启它(默认关闭,因为它会在这台 Mac 上开放一个网络端口)。然后点击侧边栏左下角的 **手机连接**:用 iPhone 相机扫描二维码(轻点 **Open in Tether**),或用 Tether 中的 **Scan code** 扫描,轻点 **Connect**,然后点击 **Approve**。请先安装 Tether:没有它,相机无法打开这个二维码。手机可以显示你的对话、发送消息(可附照片:输入框的 **+** → Camera、Photos 或 Paste image)、回答审批和问题,以及切换模型和智能体。你可以配对任意多台 Mac:点击应用左上角的 Mac 名称即可在它们之间切换。**手机连接** 面板会列出已配对的 iPhone 及其上次连接时间:点击 **Remove** 可立即断开其中一部。“Tailscale only”会拒绝来自本地网络的连接(适用于共享 Wi-Fi),访问日志会显示谁尝试过连接。在 Tether 中,“Settings → Privacy”可以用 Face ID 锁定应用。 | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="截图:手机连接(iPhone)"></a> |
106
- | **远程电脑** | <a id="feature-remotecomputers"></a>通过 [Tailscale](https://tailscale.com) 打开你其他 Mac 上的 dsh,并在本 dsh 窗口中使用它们。在每台 Mac 的 **设置 → Composer Plus** 中开启它(默认关闭,因为它会打开网络端口)。在要被打开的 Mac 上开启 **允许其他电脑打开本机**,点击 **创建配对链接** 并复制链接。在本机左侧边栏的电脑选择器(品牌名右侧、**新建会话** 上方)中选择 **添加电脑…**,粘贴链接,输入 **名称**(不能与本机或其他电脑同名),点击 **连接**,然后在另一台 Mac 上点击 **批准**。之后选择器会列出 **本机** 和你的电脑:选择一台,它的 dsh 会占满本窗口,带有它自己的对话、侧边栏、工具和文件,而本机会在后台继续运行。另一台 Mac 的页面在同一位置显示同一个选择器:在那里选择 **本机** 即可返回。设置面板可以重命名和移除电脑,并列出可以打开本机的电脑(**移除** 会立即断开其中一台)。 | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="截图:远程电脑"></a> |
107
+ | **远程电脑** | <a id="feature-remotecomputers"></a>通过 [Tailscale](https://tailscale.com) 打开你其他 Mac 上的 dsh,并在本 dsh 窗口中使用它们。在每台 Mac 的 **设置 → Composer Plus** 中开启它(默认关闭,因为它会打开网络端口)。在要被打开的 Mac 上开启 **允许其他电脑打开本机**,点击 **创建配对链接** 并复制链接。在本机左侧边栏的电脑选择器(品牌名右侧、**新建会话** 上方)中选择 **添加电脑…**,粘贴链接,输入 **名称**(不能与本机或其他电脑同名),点击 **连接**,然后在另一台 Mac 上点击 **批准**。之后选择器会列出 **本机** 和你的电脑:选择一台,它的 dsh 会占满本窗口,带有它自己的对话、侧边栏、工具和文件,而本机会在后台继续运行。选择器仍在同一位置,显示为 **返回本机**:点击它即可返回。如果你有多台电脑,点击会打开菜单,在其中选择 **本机** 或另一台电脑。设置面板可以重命名和移除电脑,并列出可以打开本机的电脑(**移除** 会立即断开其中一台)。 | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="截图:远程电脑"></a> |
107
108
  | **自动更新** | <a id="feature-autoupdate"></a>dsh 启动时,插件会检查 [最新的 GitHub release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)。如果它比当前版本新,并且已发布到 npm,插件会通过 dsh 自带的插件管理器(与 设置 → 插件 相同的途径)安装这个确切的版本,并通知你。重启 dsh 即可加载新版本。**设置 → Composer Plus → Composer Plus 更新** 会显示版本号,并提供 **检查更新** / **立即更新**。dsh 第一次以新版本启动时,会显示一次 **Composer Plus N 的新功能** 窗口,内容是该版本的发布说明,使用 **应用语言** 中选择的语言(说明随新版本一起安装,不会额外联网;没有该语言的说明时显示英文说明);点击 **关闭** 或按 `Esc` 关闭。说明下方有一行请求在 GitHub 上加星标,最多每 30 天显示一次(不联网);点击 **在 GitHub 上加星标** 或 **不再询问** 后不再显示。 通过 设置 → 插件 或复制文件夹更新后,每个新版本也会显示一次该窗口;首次安装时不显示。更新行中的 **此版本的新功能** 可再次打开它。如果磁盘上的版本比正在运行的版本新,该行会提示重启 dsh。 | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="截图:自动更新"></a> |
108
109
  | **开/关筛选** | <a id="feature-featurefilter"></a>在 **设置 → Composer Plus** 的 **搜索功能** 旁边:**全部** 显示所有功能,**已开启** 只显示开关已开启的功能,**已关闭** 只显示开关已关闭的功能。依据是每一行自己的开关,也包括 dsh Host 保存的开关(例如 **手机连接**)。它与搜索一起使用:输入一个词并选择 **已关闭**,即可找到你关闭过的功能。在 **已开启** 或 **已关闭** 下切换过的行会一直保留,直到你再次选择筛选,因此焦点会停在它的开关上。**已开启** 和 **已关闭** 会隐藏 **应用语言** 和 **Composer Plus 更新** 两行(它们没有开关)。每次打开设置时都从 **全部** 开始。 | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="截图:开/关筛选"></a> |
109
110
  | **报告问题** | <a id="feature-issuereport"></a>设置 → Composer Plus → **报告问题…**(在介绍文字下方),或在侧边栏中右键点击对话(或打开它的 **…** 菜单)→ **报告 Composer Plus 问题…**。选择类型:**缺陷**、**功能请求**、**改进**、**翻译** 或 **提问**。用你自己的话和语言描述它,然后点击 **写草稿**(或按 `Cmd/Ctrl+Enter`)。调用一次 dsh 的默认模型写出英文 issue:标题带有该类型的前缀(例如 `[Bug]`),正文包含该类型的各个部分(缺陷为:What happened、Steps to reproduce、Expected、Actual),另加一行 Composer Plus、dsh 和系统的版本。阅读并修改标题和描述;**重新生成** 会写一份新草稿。**创建 issue** 会用你的 GitHub CLI(`gh`)登录在 Composer Plus 的 GitHub 仓库中创建它,并显示它的链接。issue 是公开的:看起来像密钥或密码的文字会被拒绝。`gh` 无法创建时,**改在 GitHub 上打开** 会打开 GitHub 自己的页面并填好草稿。 | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="截图:报告问题"></a> |
@@ -198,6 +199,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
198
199
  - **在新对话中继续:** 在你点击之前,什么都不会运行。点击后,Host 端会把对话(与目标检查读取的方式相同:不含推理内容和已回退的步骤)发送给对话自己的模型,并显示交接说明;只有 **开始新对话** 才会创建新对话。项目中不会写入任何内容。
199
200
  - **上下文明细:** 只在 Host 上读取对话日志;不调用模型,不读取项目文件。
200
201
  - **任务看板:** 看板显示 dsh 自己的对话,数据来自 dsh 在此窗口中自己的列表;它不会添加自己的对话数据。**新建任务** 会打开 dsh 自己的新对话,你在 dsh 的输入框中写第一条消息,因此审批、沙箱和对话的模型照常适用。Host 端把该对话的第一条消息保存为卡片的提示,并以另一次不带工具的请求,把它(只有前 4,000 个字符,没有其他内容)发送给该对话的模型,以获得最多 3 个标签。每个任务的提示、标签和开始时间保存在 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` 中(仅所有者可访问的文件,保留最新的 2,000 个),还保存你用 **×** 或 **全部清除** 从看板移除的对话的 ID(保留最新的 5,000 个);开关保存在旁边的 `board-switch.json` 中。不会向任何项目文件夹写入内容。**回答** 会把你的回答发送给 dsh 自己的待处理请求,与对话中自己的卡片做法相同。早期版本的旧任务列表(`board.json`)原样留在磁盘上,不会被读取。**悬停显示进度** 在这台 Mac 上读取对话的日志。使用 **快速(不用 AI)**(默认)时,不发送任何内容。使用 **AI 摘要** 时,在正在运行的卡片的进度框显示期间(或在 Tether 的看板打开期间,最多 8 张正在运行的卡片),Host 端会把该对话最新的部分(最多约 6,000 个字符:你的消息、智能体的文字回复、它的工具调用及其结果的末尾;不含推理和已回退的消息)以一次不带工具的请求发送给该对话的模型。只有在对话有了新进展后才会再次发送,每个对话最多每 20 秒一次。说明只保存在内存中;设置保存在 `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` 中(仅所有者可访问的文件)。
202
+ - **助理:** 助理对话是 `~/Assistant` 中的一个普通 dsh 对话;它的模型请求和其他对话一样发送到 dsh 的默认模型。它的工具会读取你在这台 Mac 上其他对话的日志(标题、项目、状态,以及用 chat_read 读取的最新消息),并且只在模型调用工具时把这些内容交给该模型。发送消息、新建、停止和归档对话都要等你批准。对话 ID 保存在 `$DSH_HOME/storages/dsh-composer-plus/assistant.json`,开关保存在同目录的 `assistant-switch.json`(仅所有者可读写)。提醒和自动化使用 dsh 自己的定时任务。除了该对话发出的模型请求和网页搜索,没有任何内容离开这台 Mac。
201
203
  - **受保护的文件:** 列表和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` 中(仅所有者可访问的文件)。检查只读取每次文件工具调用的路径(及其真实路径),从不读取文件本身。
202
204
  - **禁止的命令:** 规则和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` 中(仅所有者可访问的文件)。检查只读取每次 `bash` 和 `pwsh` 调用的命令文本;它不运行任何内容,也不发送任何内容。
203
205
  - **密钥输入:** 值只会在回答请求中从卡片(或经由不记录请求内容的网关从 Tether)发送到 Host。Host 将它写入 `$DSH_HOME/storages/dsh-composer-plus/secrets/<随机名称>`(文件夹 0700,文件 0600);不会写入项目、对话记录或工具结果。Host 会在内存中保留该值,以便在该对话之后的工具结果中把它替换为 `[secret]`。文件和这份副本会在该对话这一轮结束时以及 dsh 启动时删除。开关在同一位置的 `secrets.json` 中。代理用该文件运行的命令可以把值发送到该命令发送的地方:这正是它的用途。
@@ -224,7 +226,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
224
226
  - **对话行上没有分支标签:** 侧边栏不是“单列表”视图(在“按工作区”和“按工作区树”中,对话行都不显示标签);或者安装此版本后,该对话还没有新的一轮;或者它的文件夹不是 git 仓库;或者 **对话行显示 Git 分支** 已关闭。更新后,请重启 dsh(分支由 Host 端记录)。
225
227
  - **目标检查显示测试以代码 127 或 “not found” 退出:** 从 Finder 或程序坞启动的 dsh 的 PATH 可能比终端里的短,因此找不到 `npm`、`pnpm` 或 `cargo`。请从终端启动 dsh,或者在 **目标检查** → **编辑** 中用完整路径设置你自己的测试命令。**立即运行** 会马上显示结果。
226
228
  - **目标没有关闭,智能体一直在工作:** **目标检查** 发现了失败的测试或缺少的工作;目标下方的一行会显示原因(将鼠标悬停在结果上可查看详情)。请修正原因或测试命令,或者用 `/goal` 或目标栏自己完成目标(这不会被检查)。
227
- - **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.23.0`),见上文的安装说明。
229
+ - **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.24.0`),见上文的安装说明。
228
230
  - **立即备份显示“另一个备份操作正在进行”:** 另一个 dsh 窗口或救援控制台中正在运行一个操作(它们共用备份文件夹中的锁文件 `.composer-plus.lock`)。请等待它完成。如果没有操作在运行,下次点击时会接管已关闭进程留下的锁。
229
231
  - **救援控制台显示“dsh is running”:** 请先退出 dsh。如果 dsh 确实已关闭,消息中提到的文件是崩溃后留下的:删除它,然后重试。
230
232
  - **恢复后 dsh 无法启动或缺少插件:** 需要重新安装 profile 的插件包。恢复后,救援控制台会提供这一步;你也可以在它列出的 `$DSH_HOME/profiles/` 下的每个文件夹中运行 `pnpm install`。不在 vault 中的机密(另一台电脑)必须重新输入:控制台会列出它们。
@@ -258,7 +260,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
258
260
  - **问题卡片适应窗口** 只改变 dsh 的问题卡片,不改变计划审阅卡片。它通过 dsh 的标记(`data-question-key`、`data-question-scroll`)找到卡片;如果 dsh 更新改变了这些标记,卡片会按 dsh 自己的样子显示。卡片高度跟随窗口,而不是对话:在较窄侧边面板中的对话里,较高的卡片仍可能超出对话上方。
259
261
  - **对话标题栏适应窗口** 通过 dsh 生成的类名(`_titleRow`、`_titleCluster`、`_crumbs`、`_headerActions`、`_headerUtilities`)找到对话标题栏,因为 dsh 没有为它提供布局接口。如果 dsh 更新改了这些类名,标题栏按 dsh 原样显示。在很窄的对话栏中,标题栏可能占两到三行,所以消息上方的空间会变小。
260
262
  - **手机连接** 只适用于 macOS(它使用 `en0`、`openssl`、`swift` 和 `dns-sd`)。它使用固定端口 19390 和 19391,因此每台 Mac 上同一时间只能有一个 dsh 运行它(每台 Mac 是手机 Mac 列表中的一项)。在 `apns.json` 中配置 APNs 密钥后(见 `tether/README.md`),Mac 通过 Apple 推送服务发送通知,即使 Tether 已关闭也能收到;Mac 必须处于唤醒状态并打开 dsh。没有该密钥时,只有在 Tether 打开或刚转入后台时,手机才能收到通知。在 Tether 中打开“Settings → Notifications → Send notifications”之前,Tether 不会发送通知。Tether 为每台已配对的 Mac 分别保存此开关和时间段。此开关在每台 Mac 上都默认关闭,打开时 iOS 会请求通知权限。iOS 应用尚未上架 App Store:请用 Xcode 从 `tether/ios` 构建它。“Tailscale only”仍然需要 Mac 有 Wi-Fi 或以太网地址(只有在有这样的地址时,网关才会启动)。访问日志按 Mac 分别保存,只保留最新的 200 次尝试;一分钟内重复的尝试不会新增一行,而是把同一行的次数加一。每条通知都会显示 Mac 和对话所属的项目(`Studio Mac · recipe-box`)、对话标题和正文:Turn finished 显示智能体的最后一条回复。有 APNs 密钥时,这段文字会经过 Apple 的推送服务。Tether 的应用锁不会隐藏 iPhone 锁定屏幕上的通知预览:请在 iOS 设置中关闭它们。Tether 的绿点跟随 Mac:在 dsh 中打开的对话,手机上的绿点也会消失。在 Tether 中打开的对话,只在手机上消失;Mac 上 dsh 自己的绿点会一直保留,直到你在 Mac 上打开该对话。
261
- - **远程电脑** 需要两台 Mac 都有 Tailscale,并且被打开的 Mac 上要有开启了此功能的 Composer Plus。那台 Mac 必须处于唤醒状态,并且正在运行 dsh。只有左侧边栏展开时才显示选择器(图标栏中不显示)。只有当另一台 Mac 装有此版本或更新版本的 Composer Plus 时,它的页面才显示选择器;版本较旧时,几秒后顶部会出现 **返回本机** 按钮。你打开过的每台电脑的页面会一直保留在内存中,直到你关闭此功能或重启 dsh。在桌面应用中,另一台 Mac 的页面是嵌入的页面:dsh 自己的键盘快捷键(例如新建对话)在其中不起作用,那里也无法下载文件、使用麦克风或通知。它使用端口 19392(每台 Mac 上只有一个 dsh 能让其他电脑进入)。另一台 Mac 页面中的选择器只在这台 Mac 的电脑之间切换,所以你不能通过另一台 Mac 打开第三台 Mac。
263
+ - **远程电脑** 需要两台 Mac 都有 Tailscale,并且被打开的 Mac 上要有开启了此功能的 Composer Plus。那台 Mac 必须处于唤醒状态,并且正在运行 dsh。只有左侧边栏展开时才显示选择器(图标栏中不显示)。如果另一台 Mac 的页面没有自己的选择器(那里的 Composer Plus 早于 1.23.0),本机的选择器会在同一位置显示在该页面上方。如果那里是 1.23.0,选择器显示那台 Mac 的名称:在它的菜单中选择 **本机** 即可返回。你打开过的每台电脑的页面会一直保留在内存中,直到你关闭此功能或重启 dsh。在桌面应用中,另一台 Mac 的页面是嵌入的页面:dsh 自己的键盘快捷键(例如新建对话)在其中不起作用,那里也无法下载文件、使用麦克风或通知。它使用端口 19392(每台 Mac 上只有一个 dsh 能让其他电脑进入)。另一台 Mac 页面中的选择器只在这台 Mac 的电脑之间切换,所以你不能通过另一台 Mac 打开第三台 Mac。
262
264
  - 会话链接在对话中有效;点击它不会打开对应的对话。用 **复制消息链接** 复制的链接,只在 dsh 0.2.1 及更高版本中、并且只从对话中的消息里才能打开对应的消息(dsh 0.2.0 没有用户文本规则,所以链接仍会被复制,但只显示为普通文本)。被回退移除的消息,或被压缩从 dsh 加载的历史中移除的消息,无法显示:此时链接会给出提示。🔗 按钮依附在 dsh 的消息行上;如果 dsh 更新改变了这部分标记,按钮就不会显示。
263
265
  - **全部标为已读** 通过 dsh 中一个不是公开 API 的部分(dsh 会话状态中的 `completionUnread` 列表)来更改 dsh 自己的未读圆点。如果 dsh 更新重命名了它,该菜单项就不会显示。该菜单项放在 dsh 项目的“…”菜单中,而这个菜单没有给插件的插槽;如果 dsh 修改了这个菜单,该菜单项也不会显示。
264
266
  - **原地编辑排队消息** 不会修改在此期间已经开始发送的消息,也不会覆盖在此期间已被修改的消息(例如在 iPhone 上的 Tether 中修改的),并会显示提示说明这一点。新图片需要支持图片的模型(dsh 自身的图片限制同样适用),新文件必须上传完成后才能保存。只能编辑你自己的排队消息,不能编辑队列中的目标轮次或对问题的回答。插件更新后,只有纯文字的编辑能立即生效:保存带图片或文件的消息之前,请重启 dsh(Host 端在启动时加载)。
@@ -294,6 +296,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
294
296
  - **土耳其语技能包** 安装的是第三方技能:规则来自作者的 GitHub 仓库,而不是 Composer Plus;新版本会在下一次每日检查后直接使用,我们不会先审核。校验只能证明文件就是 GitHub 为该提交列出的文件,不能证明规则本身是好的。何时加载该技能由模型决定(你也可以按名称调用);这些规则只适用于土耳其语文本。Host 端使用浏览器最后报告的语言:两个浏览器使用不同语言时,以最新的报告为准。未登录时 GitHub 每小时只允许 60 次 API 请求;检查被拒绝时会保留已安装的副本,并在设置中显示原因。
295
297
  - **理清代码库** 附带的是该技能的固定副本(caldoai/skills,提交 f3cf477):上游的改动只会随新的 Composer Plus 版本到来。该技能会运行一个较长的目标,可能改动很多文件,它的子智能体和检查也会消耗大量令牌。项目没有测试的地方,它可能在你不知情时改变行为:请在单独的分支上启动,合并前先阅读差异。项目中、自定义技能文件夹中或 `~/.dsh/skills` 中的同名技能会取代它。开关关闭时,`/untangle-codebase` 会作为普通文本发给模型。
296
298
  - **任务看板** 显示 dsh 在此窗口中列出的对话:不在项目中的对话只显示在**所有项目**中,“每个对话一个分支”的文件夹(`<project>/.worktrees/<name>`)算作它所属的项目。卡片所在的列就是对话的实时状态,因此卡片不能拖动:对话的回合结束时(包括出错或停止之后)会移到**已完成**,再次运行时会回到**进行中**。绿色圆点是 dsh 自己的完成圆点,dsh 只在此窗口中保留它:重新加载后,已完成的对话不再显示圆点。**已完成** 显示最新的 50 个对话(**显示更早的 N 个** 显示其余对话)。**搜索项目** 只按名称查找项目,不按文件夹路径查找。当项目的所有对话都超过 2 小时、处于空闲且已读时,**最近 2 小时内活跃** 会隐藏该项目;看板仍会显示你选择的项目。**新建任务** 只记住此窗口中最新的一个新对话:如果你在发出第一条消息前打开了另一个对话,该对话会以 **新建任务** 留在 **进行中** 的最上方,直到你在其中写消息,但只有最新的那个对话会自动回到看板。重新加载后,没有消息的新对话不会出现在看板上(dsh 把它保留为自己的空白新会话)。标签来自每个任务根据其第一条消息进行的一次模型调用:它们可能不准确,不是在看板上开始的对话没有标签。标题是 dsh 自己的对话标题(由 dsh 的标题服务使用对话的模型生成);标题出现前,卡片显示第一条消息的第一行。**×** 和 **全部清除** 只把卡片从看板移除:不会删除任何对话。**撤销** 只显示 8 秒,并且只在此窗口中;之后,**已移除 (N)** → **放回** 可让卡片回来,再次运行的对话也会自动回来。**全部清除** 会先询问,然后移除所显示项目中已读的已完成卡片(选择 **所有项目** 时为所有项目),也包括 **显示更早的 N 个** 后面的卡片;未读(绿色)卡片会保留。dsh 只在此窗口中保留绿色圆点,因此重新加载后,全部清除可能会移除你还没读过回答的卡片。这个列表保存在这台 Mac 上,对每个窗口和 Tether 都有效;列表达到 5,000 个对话时,最早的对话会回来。**回答** 只回答对话最新的请求:如果对话已在别处(另一个窗口、Tether、Auto Review)回答了它,或提出了新的问题,面板会说明这一点,并且不发送任何内容。早期版本有带评论和智能体工具的任务列表;它们已被移除,旧的 `board.json` 不会显示。创意和外观来自 emanuele-em 的 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0);Composer Plus 没有使用它的任何代码。 `Cmd+Shift+K` 是 dsh 快捷键:在 Linux 的浏览器中,它没有默认按键,需要你在 dsh 的键盘快捷键页面中设置;浏览器扩展或其他应用也可能先占用它。卡片在 dsh 自己的绿点消失时(你打开了对话)离开**已完成**;对于在看板后面作为当前对话完成的对话,则在它显示且上面没有面板时离开。这个已读状态和 dsh 自己的圆点一样只保存在当前 dsh 窗口中:重新加载后或在另一个窗口中,所有已完成的对话都算已读,因此都在**最近完成**中。
299
+ - **助理** 在这台 Mac 的所有窗口中只有一个对话。它以 workspace-write 权限模式运行:只在 `~/Assistant` 中写文件,在其外运行的命令会先征求同意。如果你把该对话切换到没有审批的模式(完全访问),dsh 会拒绝每次审批,因此助理无法发送、新建、停止或归档对话。审批卡片只保护这六个工具:和该模式下的任何对话一样,助理运行的 shell 命令仍然可以访问网络。在 dsh 0.2.0 和 0.2.1 中,dsh 的定时任务工具只能看到助理对话自己的提醒,看不到其他对话的自动化;从 dsh 0.2.2 起,它们可以列出并修改所有定时任务。chats_list 不包含已归档、空白和子智能体对话,也不包含助理对话本身;“等待你”表示运行中的对话有未处理的审批、问题或计划审核。chat_read 返回用户的消息和智能体的回复(不含工具输出),最多 50 条消息、约 24,000 个字符。chat_archive 会拒绝仍在运行或有活动提醒的对话。模型仍可能被它读到的文本误导:审批卡片是最后一道检查,点击 **允许一次** 之前请先阅读。
297
300
  - **停止后发送的消息优先** 只在你停止对话后生效(或在某一轮失败后,或打开仍有队列的对话时):对话运行时发送的消息仍会排在队列末尾。它只会越过你自己的排队消息:如果队列中有目标轮次或问题回复,仍保持 dsh 自己的顺序。它会读取 dsh 中一个非公开 API 的部分(被停止的那一轮是否仍在结束中);如果 dsh 更新后改了它的名称,消息要等那一轮结束后才会被移到前面。子代理对话保持 dsh 自己的顺序。
298
301
  - **项目记忆** 属于对话的第一个文件夹(dsh 的项目文件夹):用 `cd` 更换文件夹的对话仍使用第一个项目的记忆;通过另一条路径打开的同一文件夹共用同一份记忆。对话开始时会冻结其记忆部分,所以之后保存的笔记从下一个对话开始显示(`memory_recall` 能立即找到)。整理只保留模型决定保留的内容:它可能漏掉某个事实,也可能保留错误的内容;请在 **打开记忆** 中检查并在那里修改,或在 dsh 关闭时手动编辑文件。**打开记忆** 会把所选项目的笔记和全局笔记(选择“全部笔记”时为所有项目;最多约 60,000 个字符,其余只计数,在该次请求中无法修改)以及你的文字发送给 dsh 的默认模型,而不是对话的模型。预览在 Mac 上保留 30 分钟,直到 dsh 重启;如果在此期间整理或智能体修改了笔记,**应用** 会拒绝,你需要重新预览。**应用** 要么保存预览中的全部修改,要么一项也不保存:只要有一项修改无法保存(例如 MEMORY.md 已满),笔记就保持原样,并显示原因。每个包含你的消息的回合结束后都会调用一次模型;调用失败时,下一个回合后会再次读取同样的消息。子智能体对话不做整理。这个思路和文件格式来自 [DS Bot](https://github.com/Fei2411/DS-Bot)(Apache-2.0);Composer Plus 没有使用它的代码,也从不读取或写入 DS Bot 自己的记忆。
299
302
  - **记忆版本历史** 为每份记忆(每个项目和全局记忆)保留最新的 50 个版本,更早的会被删除。一个版本保存的是该项目的整份记忆,而不是一条笔记。**恢复** 会放回该版本的所有文件(包括主题);如果打开版本之后记忆又被修改,就会拒绝恢复。恢复前的记忆会成为一个新版本,所以可以撤销。开关关闭时,不会保留新版本,**恢复** 也会被拒绝;已保留的版本仍在。安装此功能之前的版本不存在:历史从安装后的第一次保存开始。
@@ -347,6 +350,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
347
350
 
348
351
  **我能把所有对话看成一个看板,并从中开始新对话吗?** 可以,使用**任务看板**(默认开启):在左侧边栏打开它。每个对话都是一张卡片,位于**进行中**、**审核**(等待你处理)或**已完成**中。**新建任务**会在项目中打开 dsh 的新对话,你的第一条消息发出后会回到看板;在橙色卡片上点击**回答**,无需打开对话即可回答。**已完成**中的**全部清除**会先询问,然后把你已读的已完成卡片从看板移除;**撤销**和**已移除 (N)**可让它们回来,对话仍保留在 dsh 中。
349
352
 
353
+ **我能有一个提醒我并管理其他对话的个人助理对话吗?** 可以,使用**助理**(默认关闭):在设置 → Composer Plus 中打开,然后点击左侧边栏中的**助理**。它用 dsh 的定时任务设置提醒,搜索网页,列出并阅读你的对话;向某个对话发送消息,或新建、停止、归档对话,都要先经过你的批准。请把你的个人资料保存在它的项目记忆中,主题为“profil”。
354
+
350
355
  **dsh 能像 dsh-backup 那样备份我的对话和设置吗?** 可以:**设置 → Composer Plus → 备份 → 立即备份**。它把相同格式的归档写入同一个文件夹(`~/Desktop/dsh-backups`),因此 dsh-backup 的归档也会显示并可以恢复,你可以卸载 dsh-backup。打开 **自动备份** 即可按计划备份。
351
356
 
352
357
  **dsh 无法再启动了。如何恢复备份?** 打开备份文件夹(`~/Desktop/dsh-backups`),双击 `Composer Plus Rescue.command`(Linux:`composer-plus-rescue.sh`,Windows:`Composer Plus Rescue.cmd`)。选择 `3) Restore a backup`,选中一份备份并输入 `RESTORE`。它不需要 dsh 也能运行。
@@ -389,7 +394,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
389
394
 
390
395
  **我的 iPhone 丢了。如何阻止它访问我的 Mac?** 点击侧边栏左下角的 **手机连接**,然后点击该 iPhone 旁边的 **Remove**。它的密钥会立即失效;只有通过你在 Mac 上批准的新配对,它才能重新连接。
391
396
 
392
- **如何在这台 Mac 上继续另一台 Mac 的对话?** 在另一台 Mac 上开启 **设置 → Composer Plus → 远程电脑** 和 **允许其他电脑打开本机**,点击 **创建配对链接** 并复制链接(例如用 AirDrop 或备忘录发给自己)。在这台 Mac 上也开启 **远程电脑**,在左侧边栏的选择器(品牌名右侧、**新建会话** 上方)中选择 **添加电脑…**,粘贴链接,输入 **名称** 并点击 **连接**,然后在另一台 Mac 上点击 **批准**。之后,在同一个菜单中选择那台电脑即可:它会占满本窗口。在同一位置选择 **本机** 即可返回;这期间这台 Mac 的对话会继续运行。
397
+ **如何在这台 Mac 上继续另一台 Mac 的对话?** 在另一台 Mac 上开启 **设置 → Composer Plus → 远程电脑** 和 **允许其他电脑打开本机**,点击 **创建配对链接** 并复制链接(例如用 AirDrop 或备忘录发给自己)。在这台 Mac 上也开启 **远程电脑**,在左侧边栏的选择器(品牌名右侧、**新建会话** 上方)中选择 **添加电脑…**,粘贴链接,输入 **名称** 并点击 **连接**,然后在另一台 Mac 上点击 **批准**。之后,在同一个菜单中选择那台电脑即可:它会占满本窗口。在同一位置点击 **返回本机** 即可返回;这期间这台 Mac 的对话会继续运行。
393
398
 
394
399
  **可以用 Face ID 锁定 Tether 吗?** 可以:在 Tether 中打开“Settings → Privacy → Lock with Face ID”。之后,Tether 在打开时以及你回到它时,都会要求 Face ID(或密码)。
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh
Binary file