dsh-composer-plus 1.16.1 → 1.17.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.id.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil itu dikelola oleh aplikasi.)
31
31
 
32
- > pnpm milik dsh melewati versi yang berumur kurang dari 24 jam. Tepat setelah rilis, tambahkan versinya: `dsh-composer-plus@1.16.1`.
32
+ > pnpm milik dsh melewati versi yang berumur kurang dari 24 jam. Tepat setelah rilis, tambahkan versinya: `dsh-composer-plus@1.17.0`.
33
33
 
34
34
  ## Fitur
35
35
 
@@ -47,6 +47,7 @@ Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil
47
47
  | **Mode rencana Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` menambahkan `/plan ` di awal draf (tekan lagi untuk menghapusnya). Jika obrolan sudah dalam mode rencana, `Shift+Tab` keluar dari mode itu. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Tangkapan layar: Mode rencana Shift+Tab"></a> |
48
48
  | **Pertahankan fokus composer** | <a id="feature-keepfocus"></a>Setelah Anda mengirim perintah `/` atau skill, kursor tetap berada di kotak pesan, dan Anda dapat langsung mengetik lagi. Ini juga berlaku untuk makro keyboard yang mengetik perintah lalu menekan `Enter`. dsh membuat kotak pesan menjadi hanya-baca saat memproses perintah, lalu browser melepas fokusnya. Fitur ini mengembalikan fokus, kecuali jika menu, dialog, atau kolom lain sedang memegangnya. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Tangkapan layar: Pertahankan fokus composer"></a> |
49
49
  | **Sesuaikan kartu pertanyaan dengan jendela** | <a id="feature-questionfit"></a>Saat agen mengajukan pertanyaan, pertanyaan dan jawabannya bergulir bersama di kartu, dan **Lewati** serta **Kirim** tetap terlihat di bawah. Kartu memakai tinggi jendela (dikurangi 200 px untuk header chat dan sebagian chat), jadi kartu membesar dan mengecil bersama jendela. Tanpa fitur ini, dsh membatasi kartu pada 60% jendela (paling tinggi 520 px) dan hanya jawaban yang bergulir: pertanyaan yang panjang dapat mendorong akhir pertanyaan, jawaban, dan tombol keluar dari kartu. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Tangkapan layar: Sesuaikan kartu pertanyaan dengan jendela"></a> |
50
+ | **Sesuaikan header chat dengan jendela** | <a id="feature-headerfit"></a>Di jendela yang sempit, tombol di header chat dsh (mode, subagen, tugas latar belakang, Buka di, label branch, dan label izin) tidak lagi saling menutupi. Judul chat tetap minimal 120 px; tombol yang tidak muat pindah ke baris kedua di kanan, dan setiap tombol tetap dapat diklik. Saat semuanya muat dalam satu baris (jendela lebar), header sama persis dengan milik dsh. Tanpa fitur ini, dsh hanya mengecilkan judul: dengan subagen dan tugas latar belakang, tombolnya saling menimpa di kolom chat yang sempit. Label branch (**Branch per obrolan**) dan label izin (**Izinkan untuk obrolan ini**) juga menyesuaikan header saat sakelar ini mati. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Tangkapan layar: Sesuaikan header chat dengan jendela"></a> |
50
51
  | **Lanjutkan Sekali Klik** | <a id="feature-continuebutton"></a>Setelah giliran dihentikan, gagal, atau terpotong, kotak pesan yang kosong menampilkan **▶**. Satu klik melanjutkan percakapan yang ada tanpa menulis di input atau menambahkan pesan obrolan yang terlihat. (Model menerima catatan tersembunyi singkat “lanjutkan dari tempat berhenti”, karena beberapa penyedia, seperti Claude, menolak permintaan yang berakhir dengan balasan asisten.) Pesan di antrean tetap di sana: ▶ hanya melanjutkan tugas yang dihentikan, lalu antrean berjalan. Giliran yang selesai tetap memakai tombol Kirim biasa. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Tangkapan layar: Lanjutkan Sekali Klik"></a> |
51
52
  | **Lanjutkan setelah mulai ulang** | <a id="feature-resumeafterrestart"></a>Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Jika Anda keluar dari dsh (atau dsh tertutup) saat sebuah obrolan sedang bekerja, obrolan itu berlanjut sendiri saat Anda membuka dsh lagi, dengan catatan tersembunyi yang sama seperti Lanjutkan Sekali Klik. Jika putaran tujuan (`/goal`) sedang berjalan, tujuan itu berlanjut ke putaran berikutnya (dsh menjeda tujuan setiap kali dimulai sampai Anda melanjutkannya). Obrolan yang Anda hentikan, yang selesai, atau yang gagal tidak berlanjut. dsh sendiri tidak memiliki pengaturan untuk ini: dsh hanya menandai giliran seperti itu sebagai terinterupsi. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Tangkapan layar: Lanjutkan setelah mulai ulang"></a> |
52
53
  | **Seret dan lepas antrean** | <a id="feature-queuereorder"></a>Pesan dalam antrean mendapat pegangan (⠿). Seret untuk mengubah urutan, atau fokuskan pegangan lalu tekan `↑` / `↓`. `Esc` membatalkan. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Tangkapan layar: Seret dan lepas antrean"></a> |
@@ -63,19 +64,22 @@ Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil
63
64
  | **Branch di pohon ruang kerja** | <a id="feature-branchtree"></a>Pengaturan → Composer Plus → **Branch di pohon ruang kerja** (mati secara default). Setiap branch yang punya folder worktree di `<project>/.worktrees/` lalu tampil sebagai proyek di dalam proyeknya; pilih **Opsi tampilan** → **Pohon Ruang Kerja** di dsh untuk melihatnya bertingkat. Branch yang foldernya dihapus keluar dari daftar, dan dsh menampilkan obrolannya di **Tanpa grup**. Saat agen obrolan di folder proyek membuat branch dan berpindah ke branch itu (`git switch -c`, `git checkout -b`) sementara folder tidak punya perubahan yang belum di-commit, folder proyek kembali ke branch sebelumnya, branch mendapat folder sendiri, dan obrolan pindah ke sana: salinannya terbuka di proyek branch dan melanjutkan tugas, dan obrolan lama diarsipkan. Daftar diperiksa saat mulai, setiap 30 detik, setelah setiap giliran, dan saat Anda kembali ke jendela. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Tangkapan layar: Branch di pohon ruang kerja"></a> |
64
65
  | **Prediksi pesan berikutnya** | <a id="feature-nextprediction"></a>Aktif secara default: Anda dapat menonaktifkannya di **Pengaturan → Composer Plus**. Setelah agen menyelesaikan satu giliran (bukan giliran yang dihentikan atau gagal), kotak pesan yang kosong menampilkan tebakan pesan Anda berikutnya dengan teks abu-abu, beserta petunjuk **Tab untuk menerima**. `Tab` memasukkan teks ke kotak pesan, tetapi tidak mengirimnya. `Esc` menyembunyikannya untuk giliran itu. Mulai mengetik juga menyembunyikannya, dan giliran baru menggantinya. Menu **Model** di bawah sakelar menampilkan model milik dsh sendiri (daftar yang sama dengan menu model dsh). **Default dsh** dipilih secara default dan mengikuti model default dsh. Setiap giliran yang selesai memakai satu panggilan model singkat. Di Tether, tebakan tampil di atas kotak pesan yang kosong: ketuk untuk memasukkannya ke kolom. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Tangkapan layar: Prediksi pesan berikutnya"></a> |
65
66
  | **Lengkapi saat mengetik** | <a id="feature-typingcompletion"></a>Nonaktif secara default: Anda dapat mengaktifkannya di **Pengaturan → Composer Plus**. Saat Anda mengetik, teks abu-abu tepat setelah kursor menunjukkan kelanjutan pesan Anda. `Tab` menambahkannya ke pesan, tetapi tidak mengirimnya. `Esc` menyembunyikannya. Fitur ini hanya menyarankan kata-kata Anda sendiri berikutnya: tidak pernah berupa jawaban untuk Anda, dan tanpa teks error atau nama karangan. Jika pesan tampak sudah lengkap atau model tidak yakin, tidak ada yang tampil. Jika Anda mengetik huruf berikutnya dari teks abu-abu itu, teks tetap ada, tanpa panggilan model baru. Fitur ini memiliki menu **Model** sendiri di bawah sakelarnya. Entri pertamanya, **Sama dengan prediksi pesan berikutnya**, memakai model **Prediksi pesan berikutnya** (default); pilih model lain untuk memakai model yang berbeda bagi setiap fitur, misalnya model yang lebih cepat untuk pelengkapan. Fitur ini melakukan satu panggilan model di setiap jeda saat Anda mengetik, jadi memakai jauh lebih banyak token daripada prediksi: pilih model yang cepat dan murah. Fitur ini tidak berjalan untuk perintah garis miring, pesan dengan chip file, atau saat kursor tidak berada di akhir. Di Tether, sisa teks tampil di atas kolom saat Anda mengetik: ketuk untuk menambahkannya. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Tangkapan layar: Lengkapi saat mengetik"></a> |
66
- | **Sempurnakan prompt** | <a id="feature-promptimprove"></a>Ketik permintaan kasar, lalu klik tongkat ajaib (**Sempurnakan prompt**) di samping menu model. Satu panggilan model menulis ulang permintaan itu menjadi prompt yang lebih jelas: tujuan lebih dulu, langkah bernomor yang singkat jika ada beberapa bagian, dan pemeriksaan yang perlu dijalankan. Fitur ini membaca obrolan ini (tanpa pesan yang ditarik oleh putar balik), README, AGENTS.md, dan manifes proyek, file yang diubah, serta file yang namanya cocok dengan kata-kata Anda, dan mempertahankan bahasa Anda. Fitur ini tidak pernah mengarang nama file. Teks baru menggantikan draf Anda, tetapi tidak dikirim: baca, edit, lalu tekan `Enter`. `Cmd/Ctrl+Z` mengembalikan teks Anda dalam satu langkah, begitu juga tombolnya (**Urungkan penyempurnaan**). Jika Anda mengetik saat fitur ini bekerja, teks baru Anda tetap ada. `Esc` atau klik kedua membatalkannya. Fitur ini memiliki menu **Model** sendiri di Pengaturan (default: **Sama dengan model obrolan**). Tidak untuk perintah garis miring atau pesan dengan chip file. Di Tether, tongkat ajaib ada di samping kolom. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Tangkapan layar: Sempurnakan prompt"></a> |
67
- | **Pemeriksaan tujuan** | <a id="feature-goalcheck"></a>Mulai tujuan dengan `/goal`. Saat agen menandai tujuan sebagai selesai dalam putaran otomatis, tujuan baru ditutup setelah dua pemeriksaan. Pertama, perintah pengujian proyek berjalan di folder obrolan, dengan mode sandbox obrolan itu. Perintah itu adalah perintah Anda sendiri atau perintah yang ditemukan di `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, atau pytest. Jika langkah terbaru agen sendiri adalah menjalankan pengujian itu dengan hasil lulus, pengujian tidak dijalankan lagi. Lalu satu panggilan model independen, tanpa alat, membaca tujuan, obrolan ini, `git status`, dan hasil pengujian. Jika satu pemeriksaan gagal, tujuan tetap aktif dan agen membaca alasannya, lalu putaran berikutnya berlanjut. Satu baris di bawah bilah tujuan (**Pemeriksaan tujuan**) menampilkan pengujian dan hasil terakhir. **Edit** mengatur perintah pengujian Anda sendiri dan batas waktu atau token; jika batas terlampaui, tujuan menjadi terhambat. **Jalankan sekarang** menjalankan pemeriksaan tanpa menutup tujuan. Fitur ini memiliki menu **Model** sendiri di Pengaturan (default: **Sama dengan model obrolan**). Jika Anda menyelesaikan tujuan sendiri, tidak ada yang diperiksa. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Tangkapan layar: Pemeriksaan tujuan"></a> |
68
- | **Memori proyek** | <a id="feature-projectmemory"></a>Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Setiap folder proyek mendapat memorinya sendiri, yang dibaca oleh obrolan berikutnya di proyek itu, seperti DS Bot menyimpan satu memori untuk setiap Bot. Setelah setiap giliran selesai, satu panggilan ke model obrolan membaca pesan baru (bukan yang ditarik oleh putar balik), menyimpan preferensi, keputusan, dan fakta Anda yang bertahan lama sebagai catatan singkat, serta mengubah atau menghapus catatan lama. Agen juga dapat menyimpan, menghapus, dan mencari catatan sendiri (`memory_remember`, `memory_forget`, `memory_recall`). Catatan juga bisa global: setiap proyek membacanya. Obrolan baru mendapat catatan di prompt sistemnya; catatan yang disimpan kemudian muncul mulai obrolan berikutnya. File berupa Markdown di folder home dsh (`storages/dsh-composer-plus/memory/`), tidak pernah di folder proyek. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Tangkapan layar: Memori proyek"></a> |
67
+ | **Sempurnakan prompt** | <a id="feature-promptimprove"></a>Ketik permintaan kasar, lalu klik tongkat ajaib (**Sempurnakan prompt**) di samping menu model. Satu panggilan model menulis ulang permintaan itu menjadi prompt yang lebih jelas: tujuan lebih dulu, langkah bernomor yang singkat jika ada beberapa bagian, dan pemeriksaan yang perlu dijalankan. Fitur ini membaca obrolan ini (tanpa pesan yang ditarik oleh putar balik), README, AGENTS.md, dan manifes proyek, file yang diubah, serta file yang namanya cocok dengan kata-kata Anda, dan mempertahankan bahasa Anda. Fitur ini tidak pernah mengarang nama file. Teks baru menggantikan draf Anda, tetapi tidak dikirim: baca, edit, lalu tekan `Enter`. `Cmd/Ctrl+Z` mengembalikan teks Anda dalam satu langkah, begitu juga tombolnya (**Urungkan penyempurnaan**). Jika Anda mengetik saat fitur ini bekerja, teks baru Anda tetap ada. `Esc` atau klik kedua membatalkannya. Fitur ini memiliki menu **Model** sendiri di Pengaturan (default: **Sama dengan model obrolan**). Pada pesan `/goal <objective>`, fitur ini hanya menulis ulang tujuannya, sebagai syarat selesai yang dapat diverifikasi oleh **Pemeriksaan tujuan**: hasil, pemeriksaan yang harus lulus, bukti yang ditampilkan di obrolan, bagian yang tidak dapat dikerjakan ditandai belum terselesaikan, dan berhenti jika hambatan yang sama tetap ada. Perintah `/goal` tetap ada. Tidak untuk perintah garis miring lainnya, kata kontrol `/goal` (`clear`, `pause`, `resume`), atau pesan dengan chip file. Di Tether, tongkat ajaib ada di samping kolom. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Tangkapan layar: Sempurnakan prompt"></a> |
68
+ | **Pemeriksaan tujuan** | <a id="feature-goalcheck"></a>Mulai tujuan dengan `/goal`. Saat agen menandai tujuan sebagai selesai dalam putaran otomatis, tujuan baru ditutup setelah dua pemeriksaan. Pertama, perintah pengujian proyek berjalan di folder obrolan, dengan mode sandbox obrolan itu. Perintah itu adalah perintah Anda sendiri atau perintah yang ditemukan di `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, atau pytest. Jika langkah terbaru agen sendiri adalah menjalankan pengujian itu dengan hasil lulus, pengujian tidak dijalankan lagi. Lalu satu panggilan model independen, tanpa alat, membaca tujuan, obrolan ini, `git status`, dan hasil pengujian. Model menjawab dengan tabel bukti: setiap bagian tujuan ditandai terverifikasi, salah, atau belum terselesaikan, beserta bukti dan perbaikannya; tujuan baru ditutup jika setiap bagian terverifikasi. Jika satu pemeriksaan gagal, tujuan tetap aktif dan agen membaca setiap bagian yang masih terbuka beserta bukti dan perbaikannya, lalu putaran berikutnya berlanjut. Satu baris di bawah bilah tujuan (**Pemeriksaan tujuan**) menampilkan pengujian, hasil terakhir, dan jumlah bagian yang terverifikasi (arahkan penunjuk ke baris itu untuk melihat tabelnya). **Edit** mengatur perintah pengujian Anda sendiri dan batas waktu atau token; jika batas terlampaui, tujuan menjadi terhambat. Batas token juga menghitung subagen obrolan. **Jalankan sekarang** menjalankan pemeriksaan tanpa menutup tujuan. Fitur ini memiliki menu **Model** sendiri di Pengaturan (default: **Sama dengan model obrolan**). Jika Anda menyelesaikan tujuan sendiri, tidak ada yang diperiksa. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Tangkapan layar: Pemeriksaan tujuan"></a> |
69
+ | **Lanjutkan di obrolan baru** | <a id="feature-handoffchat"></a>Klik kanan obrolan di bilah samping (atau buka menu **…** obrolan itu) → **Lanjutkan di obrolan baru…**. Satu panggilan ke model obrolan itu sendiri menulis catatan serah terima dari apa yang ditampilkan obrolan: Tugas, Hasil, Selesai, Keputusan, Masalah terbuka, dan Tindakan berikutnya (panggilan alat dan hasilnya menjadi bukti; langkah yang Anda putar balik tidak disertakan). Catatan terbuka di sebuah dialog: baca dan edit catatan itu. **Tulis ulang** menulis catatan baru. **Mulai obrolan baru** (atau `Cmd/Ctrl+Enter`) membuka obrolan baru di proyek yang sama dengan catatan itu dan tautan ke obrolan lama sebagai pesan pertamanya; obrolan lama tetap seperti semula. Gunakan saat obrolan panjang sudah penuh atau lambat, atau untuk melanjutkan besok. Tidak ada yang ditulis ke proyek. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Tangkapan layar: Lanjutkan di obrolan baru"></a> |
70
+ | **Rincian konteks** | <a id="feature-contextbreakdown"></a>Bilah samping kanan → `+` → **Konteks**. Halaman ini menampilkan apa yang sekarang mengisi konteks model obrolan yang terbuka dan berapa banyak jendela konteks yang dipakainya: prompt sistem, instruksi proyek (AGENTS.md), skill, pesan Anda, balasan agen dan panggilan alat, hasil alat (per alat), hasil MCP (per server), definisi alat, ringkasan pemadatan, dan catatan konteks lainnya, masing-masing dengan token dan porsinya. Klik sebuah bagian untuk melihat alat atau servernya. Halaman ini hanya membaca log obrolan, setelah `/compact` dan putar balik, dan tidak memanggil model; halaman ini membaca ulang setelah setiap giliran dan dengan **Segarkan**. Gunakan untuk melihat mengapa obrolan lambat atau penuh, misalnya karena hasil alat MCP yang besar atau banyak definisi alat. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Tangkapan layar: Rincian konteks"></a> |
71
+ | **File yang dilindungi** | <a id="feature-protectedfiles"></a>Aktif secara bawaan. Alat file milik agen sendiri tidak dapat membaca atau mengubah file yang cocok dengan pola Anda: `read`, `read_image`, dan `grep` pada file ditolak untuk pola **baca dan tulis**, sedangkan `write`, `edit`, dan `str_replace_editor` ditolak untuk kedua jenis. Agen membaca alasannya dan diminta untuk bertanya kepada Anda. Pola bawaannya `.env*`, `*.pem`, dan `*.key`. Pengaturan → Composer Plus → **File yang dilindungi**: tambahkan pola (misalnya `published/**` atau `config/*.yml`), klik jenisnya untuk beralih antara **baca dan tulis** dan **hanya tulis**, hapus dengan ✕, atau klik **Gunakan bawaan**. Pola tanpa `/` cocok dengan nama file di folder mana pun. Ini pagar pengaman, bukan sandbox: perintah shell (`cat .env`), skrip, atau alat MCP tetap dapat menjangkau file itu (lihat Batasan). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Tangkapan layar: File yang dilindungi"></a> |
72
+ | **Memori proyek** | <a id="feature-projectmemory"></a>Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Setiap folder proyek mendapat memorinya sendiri, yang dibaca oleh obrolan berikutnya di proyek itu, seperti DS Bot menyimpan satu memori untuk setiap Bot. Setelah setiap giliran selesai, satu panggilan ke model obrolan membaca pesan baru (bukan yang ditarik oleh putar balik), menyimpan preferensi, keputusan, dan fakta Anda yang bertahan lama sebagai catatan singkat, serta mengubah atau menghapus catatan lama. Agen juga dapat menyimpan, menghapus, dan mencari catatan sendiri (`memory_remember`, `memory_forget`, `memory_recall`). Catatan juga bisa global: setiap proyek membacanya. Obrolan baru mendapat catatan di prompt sistemnya; catatan yang disimpan kemudian muncul mulai obrolan berikutnya. File berupa Markdown di folder home dsh (`storages/dsh-composer-plus/memory/`), tidak pernah di folder proyek. **Buka memori** di baris yang sama menampilkan semua catatan tersimpan, dikelompokkan per proyek (dan memori global), dengan saringan. Tulis dengan kata-kata Anda apa yang diubah (misalnya "saya beralih dari yarn ke pnpm"), lalu **Pratinjau perubahan**: model default dsh mengusulkan perubahan, dan hanya **Terapkan** yang menyimpannya. Di Tether: menu judul obrolan → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Tangkapan layar: Memori proyek"></a> |
69
73
  | **Izinkan untuk obrolan ini** | <a id="feature-allowforchat"></a>Saat Tinjauan otomatis bertanya kepada Anda, kartu persetujuan mendapat tombol **Izinkan untuk obrolan ini**: mulai saat itu, alat yang sama di obrolan yang sama diizinkan, dengan argumen apa pun, sampai batas waktu berakhir (1 jam secara default; pilih di **Pengaturan → Composer Plus → Izinkan untuk obrolan ini**). Setelah itu agen bertanya lagi. Sebuah chip di header menampilkan daftar izin beserta waktu berakhirnya dan dapat mencabutnya. Izin tetap ada setelah mulai ulang. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Tangkapan layar: Izinkan untuk obrolan ini"></a> |
70
74
  | **Status proyek** | <a id="feature-projectstatus"></a>Baris proyek di bilah samping menampilkan penanda spinner / menunggu / selesai yang sama seperti obrolannya. Jadi, proyek yang diciutkan tetap memberi tahu Anda bahwa ada obrolan di dalamnya yang sedang bekerja atau memerlukan Anda. Obrolan yang menunggu Anda ditampilkan lebih dulu, lalu obrolan selesai yang belum Anda buka (titik hijau, juga saat obrolan lain masih berjalan), lalu spinner. Arahkan penunjuk ke penanda itu untuk melihat detailnya. Di **Pohon Ruang Kerja**, baris folder induk juga menampilkan obrolan dari setiap proyek di dalamnya (misalnya setiap folder branch di `.worktrees/`), juga saat folder itu diciutkan. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Tangkapan layar: Status proyek"></a> |
71
- | **Branch Git di baris obrolan** | <a id="feature-sessionbranch"></a>Setiap baris obrolan di bilah samping menampilkan label abu-abu kecil berisi branch git tempat folder proyek obrolan berada pada giliran terakhir obrolan itu (misalnya `main` atau `feature/login`; HEAD yang terlepas menampilkan ID commit pendeknya dalam tanda kurung). Dua obrolan dari satu proyek di branch yang berbeda tidak lagi terlihat sama, dan Anda langsung melihat saat akan melanjutkan obrolan di branch yang salah. Arahkan penunjuk ke label untuk melihat nama lengkapnya. Bagian Host membaca branch (`git branch --show-current`, hanya baca) saat giliran dimulai dan saat berakhir; obrolan tanpa giliran sejak Anda memasang fitur ini, atau folder yang bukan repositori git, tidak menampilkan label. Jika baris proyek di atas obrolan bernama sama dengan branch-nya (misalnya folder “Branch per obrolan”), baris obrolan tidak menampilkan label, tetapi “Dalam satu daftar” tetap menampilkannya. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Tangkapan layar: Branch Git di baris obrolan"></a> |
75
+ | **Branch Git di baris obrolan** | <a id="feature-sessionbranch"></a>Setiap baris obrolan di bilah samping menampilkan label abu-abu kecil berisi branch git tempat folder proyek obrolan berada pada giliran terakhir obrolan itu (misalnya `main` atau `feature/login`; HEAD yang terlepas tidak punya branch sehingga tidak menampilkan label). Dua obrolan dari satu proyek di branch yang berbeda tidak lagi terlihat sama, dan Anda langsung melihat saat akan melanjutkan obrolan di branch yang salah. Arahkan penunjuk ke label untuk melihat nama lengkapnya. Bagian Host membaca branch (`git branch --show-current`, hanya baca) saat giliran dimulai dan saat berakhir; obrolan tanpa giliran sejak Anda memasang fitur ini, atau folder yang bukan repositori git, tidak menampilkan label. Jika baris proyek di atas obrolan bernama sama dengan branch-nya (misalnya folder “Branch per obrolan”), baris obrolan tidak menampilkan label, tetapi “Dalam satu daftar” tetap menampilkannya. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Tangkapan layar: Branch Git di baris obrolan"></a> |
72
76
  | **Tandai semua sudah dibaca** | <a id="feature-markprojectread"></a>Di bilah samping, klik tombol **…** pada sebuah proyek → **Tandai semua sudah dibaca**. Semua obrolan di proyek itu langsung kehilangan titik hijau belum dibaca; proyek lain tetap memiliki titiknya. Item ini tampil abu-abu (**Tidak ada obrolan yang belum dibaca**) jika proyek itu tidak punya obrolan yang belum dibaca. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Tangkapan layar: Tandai semua sudah dibaca"></a> |
73
77
  | **Proyek aktif di atas** | <a id="feature-activeprojectsfirst"></a>Saat sebuah obrolan mulai berjalan atau memerlukan Anda, proyeknya pindah ke bagian atas bilah samping dengan animasi baris bawaan dsh (gerakan yang sama seperti saat Anda menyeretnya ke sana). Proyek yang selesai tetap di tempatnya; seret ke mana saja seperti biasa. Perpindahan disimpan ke urutan proyek dsh, jadi menonaktifkan fitur ini mempertahankan urutan saat ini. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Tangkapan layar: Proyek aktif di atas"></a> |
74
78
  | **Filter proyek terbaru** | <a id="feature-recentprojects"></a>Bilah samping → opsi tampilan (ikon slider) → **Aktif dalam 2 jam terakhir**. Selama opsi ini dipilih, bilah samping hanya menampilkan proyek yang memiliki obrolan aktif dalam 2 jam terakhir. Itu adalah obrolan yang diperbarui dalam waktu itu, obrolan yang sedang berjalan atau menunggu, obrolan yang terbuka, atau obrolan selesai yang belum Anda buka (titik hijau “selesai” dari dsh), juga setelah 2 jam. Proyek tanpa obrolan seperti itu disembunyikan, termasuk proyek baru dan kosong. Di **Pohon Ruang Kerja**, folder induk tetap terlihat selama ada proyek aktif di dalamnya, dan obrolan yang tidak aktif dalam 2 jam terakhir juga disembunyikan, sehingga hanya obrolan terbaru yang ditampilkan. Pilih opsi ini lagi untuk menampilkan semua proyek. Pilihan ini disimpan di perangkat ini. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Tangkapan layar: Filter proyek terbaru"></a> |
75
79
  | **Ciutkan semua proyek** | <a id="feature-collapseprojects"></a>Saat ada proyek yang terbuka di bilah samping, sebuah tombol muncul di samping opsi tampilan (ikon slider). Klik tombol itu untuk menutup semua proyek yang terbuka sekaligus, misalnya 3 proyek terbuka dari 5. Tombol itu tersembunyi lagi saat tidak ada proyek yang terbuka. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Tangkapan layar: Ciutkan semua proyek"></a> |
76
80
  | **Urutkan menurut status** | <a id="feature-statusorder"></a>Bilah samping → opsi tampilan → **Urutkan menurut** → **Menurut status** (dengan **Dalam satu daftar**). Obrolan yang selesai muncul pertama (titik “selesai” dari dsh, yang juga didapat oleh giliran yang berakhir dengan kesalahan). Lalu muncul obrolan yang berjalan atau menunggu, lalu obrolan dengan otomatisasi aktif (Tugas otomatisasi), lalu sisanya dalam urutan dsh. Membuka obrolan yang selesai memindahkannya ke bawah. Hanya tampilan yang berubah: pilih **Manual** atau **Terakhir diperbarui** untuk kembali. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Tangkapan layar: Urutkan menurut status"></a> |
77
81
  | **Notifikasi latar belakang** | <a id="feature-notifications"></a>Saat dsh berada di latar belakang, Anda mendapat notifikasi ketika sebuah giliran selesai (baris pertama balasan). Anda juga mendapat notifikasi ketika obrolan benar-benar menunggu Anda: persetujuan (nama alat), jawaban (pertanyaannya), atau tinjauan rencana. Permintaan harus masih terbuka 1,5 detik kemudian. Jadi, persetujuan yang dijawab otomatis (izin Tinjauan otomatis, plugin lain) tidak memunculkan notifikasi, dan notifikasi ditarik begitu permintaannya dijawab. Lencana di Dock/taskbar menghitung obrolan yang menunggu. Mengklik notifikasi membuka obrolan itu. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Tangkapan layar: Notifikasi latar belakang"></a> |
78
- | **Buka obrolan yang menunggu saat tidak aktif** | <a id="feature-idleswitch"></a>Saat obrolan mengajukan pertanyaan atau menunggu persetujuan atau tinjauan rencana (titik oranye) dan Anda tidak menggunakan dsh selama 30 detik, dsh membuka obrolan itu. Jika ada beberapa obrolan yang menunggu, obrolan yang paling lama menunggu dibuka lebih dulu; obrolan berikutnya dibuka setelah 30 detik lagi tanpa penggunaan. Tombol, klik, gerakan mouse, roda gulir, atau sentuhan memulai ulang hitungan 30 detik. Teks di kolom yang sedang fokus, teks yang dipilih, atau menu atau dialog yang terbuka juga menghentikan perpindahan. Selama obrolan yang menunggu ada di layar, tidak ada yang berubah. Jika Anda meninggalkan obrolan yang menunggu tanpa menjawab, obrolan itu dapat terbuka lagi setelah 30 detik berikutnya tanpa penggunaan. Ini juga berlaku saat dsh berada di latar belakang, tetapi dsh tidak muncul ke depan. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Tangkapan layar: Buka obrolan yang menunggu saat tidak aktif"></a> |
82
+ | **Buka obrolan yang menunggu saat tidak aktif** | <a id="feature-idleswitch"></a>Saat obrolan mengajukan pertanyaan, menunggu persetujuan atau tinjauan rencana (titik oranye), atau menyelesaikan giliran yang belum Anda baca (titik hijau), dan Anda tidak menggunakan dsh selama 30 detik, dsh membuka obrolan itu. Obrolan oranye dibuka sebelum obrolan hijau. Di setiap kelompok, obrolan yang paling lama menunggu dibuka lebih dulu; obrolan berikutnya dibuka setelah 30 detik lagi tanpa penggunaan. Tombol, klik, gerakan mouse, roda gulir, atau sentuhan memulai ulang hitungan 30 detik. Teks di kolom yang sedang fokus, teks yang dipilih, atau menu atau dialog yang terbuka juga menghentikan perpindahan. Selama obrolan yang menunggu ada di layar, tidak ada yang berubah. Jika Anda meninggalkan obrolan yang menunggu tanpa menjawab, obrolan itu dapat terbuka lagi setelah 30 detik berikutnya tanpa penggunaan. Saat obrolan hijau terbuka, titiknya hilang; obrolan hijau berikutnya baru terbuka setelah Anda menggunakan dsh lagi, lalu tidak menggunakannya selama 30 detik. Ini juga berlaku saat dsh berada di latar belakang, tetapi dsh tidak muncul ke depan. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Tangkapan layar: Buka obrolan yang menunggu saat tidak aktif"></a> |
79
83
  | **Bahasa aplikasi** | <a id="feature-language"></a>Pengaturan → Composer Plus → **Bahasa aplikasi** mengganti seluruh antarmuka dsh ke Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt, atau हिन्दी (lihat di bawah). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Tangkapan layar: Bahasa aplikasi"></a> |
80
84
  | **Koneksi seluler (iPhone)** | <a id="feature-mobileconnect"></a>Gunakan dsh dari iPhone Anda dengan aplikasi [Tether](tether/), di Wi-Fi yang sama atau melalui [Tailscale](https://tailscale.com). Aktifkan di **Pengaturan → Composer Plus** (nonaktif secara default karena membuka port jaringan di Mac ini). Lalu klik **Koneksi seluler** di kiri bawah bilah samping: pindai kode QR dengan Kamera iPhone (ketuk **Open in Tether**) atau dengan **Scan code** di Tether, ketuk **Connect**, lalu klik **Approve**. Instal Tether terlebih dahulu: tanpa aplikasi itu, Kamera tidak dapat membuka kode tersebut. Ponsel menampilkan obrolan Anda, mengirim pesan (dengan foto: **+** di kotak pesan → Camera, Photos, atau Paste image), menjawab persetujuan dan pertanyaan, serta mengganti model dan agen. Pasangkan Mac sebanyak yang Anda mau: nama Mac di kiri atas aplikasi berpindah di antara Mac tersebut. Panel **Koneksi seluler** menampilkan iPhone yang dipasangkan beserta koneksi terakhirnya: **Remove** langsung memutus salah satunya. “Tailscale only” menolak jaringan lokal (untuk Wi-Fi bersama), dan log akses menampilkan siapa yang mencoba terhubung. Di Tether, “Settings → Privacy” mengunci aplikasi dengan Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Tangkapan layar: Koneksi seluler (iPhone)"></a> |
81
85
  | **Pembaruan otomatis** | <a id="feature-autoupdate"></a>Saat dsh dimulai, plugin memeriksa [rilis GitHub terbaru](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Jika rilis itu lebih baru dan sudah ada di npm, plugin memasang versi persis itu melalui pengelola plugin bawaan dsh (jalur yang sama dengan Pengaturan → Plugin) dan memberi tahu Anda. Mulai ulang dsh untuk memuatnya. **Pengaturan → Composer Plus → Pembaruan Composer Plus** menampilkan versi dan memiliki **Periksa pembaruan** / **Perbarui sekarang**. Saat dsh pertama kali dimulai dengan versi baru, jendela **Yang baru di Composer Plus N** menampilkan catatan rilis versi itu satu kali (dari pemeriksaan pembaruan yang sama, tanpa panggilan jaringan lain); **Tutup** atau `Esc` menutupnya. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Tangkapan layar: Pembaruan otomatis"></a> |
@@ -160,7 +164,10 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
160
164
  - **Lengkapi saat mengetik:** nonaktif sampai Anda mengaktifkannya. Selama aktif, di setiap jeda saat Anda mengetik, bagian Host mengirim teks yang sudah Anda ketik, serta pesan Anda sendiri di obrolan itu dan balasan teks agen (tanpa keluaran alat, tanpa konteks tersembunyi, tanpa penalaran), paling banyak sekitar 3.000 karakter dari obrolan, ke model yang dipilih di **Lengkapi saat mengetik** (secara default model **Prediksi pesan berikutnya**). Jeda yang lebih baru menghentikan permintaan yang lebih lama. Tidak ada yang disimpan di obrolan. Sakelar disimpan di `$DSH_HOME/storages/dsh-composer-plus/complete.json` (file hanya untuk pemilik).
161
165
  - **Sempurnakan prompt:** tidak ada yang berjalan sampai Anda mengklik tongkat ajaib. Setelah itu, bagian Host mengirim draf Anda, pesan Anda sendiri di obrolan itu dan balasan teks agen (tanpa keluaran alat, tanpa konteks tersembunyi, tanpa penalaran, tanpa pesan yang ditarik oleh putar balik; paling banyak sekitar 6.000 karakter, bagian terbaru), ringkasan proyek yang sama dengan **Ide fitur** (dengan aturan file yang sama: tanpa `.env*` atau file kunci, tanpa symlink ke luar folder, tanpa FIFO), jalur yang dicantumkan `git status` sebagai berubah, dan paling banyak 30 jalur yang dilacak atau tidak dilacak (tidak diabaikan) yang namanya memiliki kata yang sama dengan draf Anda, ke model yang dipilih di **Sempurnakan prompt** (secara default model obrolan itu sendiri), sebagai satu permintaan. Isi file selain ringkasan itu tidak dikirim. Tidak ada yang ditulis ke obrolan atau proyek: jawaban hanya menggantikan draf Anda di kotak pesan, dan Anda yang memutuskan apakah akan mengirimnya. Pilihan model disimpan di `$DSH_HOME/storages/dsh-composer-plus/improve.json` (file hanya untuk pemilik).
162
166
  - **Pemeriksaan tujuan:** hanya berjalan saat agen menandai `/goal` sebagai selesai dalam putaran otomatis (atau saat Anda mengklik **Jalankan sekarang**). Bagian Host menjalankan perintah pengujian di folder obrolan dengan mode sandbox obrolan itu (seperti alat `bash` milik dsh sendiri: kebijakan akses file yang sama; jika sandbox itu tidak dapat dimulai, pengujian tidak berjalan dan pemeriksaan gagal). Untuk menemukan perintahnya, bagian ini hanya membaca `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml`, dan `pytest.ini`, sebagai file biasa di dalam folder (tanpa symlink ke luar folder, tanpa FIFO). Lalu bagian ini mengirim tujuan, obrolan sejak tujuan dimulai (pesan Anda, balasan agen, panggilan alat yang dipotong menjadi 1.000 karakter, dan 2.000 karakter terakhir dari setiap hasil alat; tanpa penalaran, tanpa langkah yang ditarik oleh putar balik; paling banyak sekitar 60.000 karakter, bagian terbaru), `git status --short`, dan bagian akhir keluaran pengujian ke model yang dipilih di **Pemeriksaan tujuan** (secara default model obrolan itu sendiri), sebagai satu permintaan tanpa alat. Keluaran alat dapat berisi apa yang dibaca agen, jadi permintaan ini dapat memuat bagian dari file Anda, sama seperti obrolan itu sendiri. Tidak ada yang ditulis ke obrolan atau proyek. Perintah pengujian Anda, batas, hasil terakhir (dengan bagian akhir keluarannya), dan pilihan model disimpan di `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (file hanya untuk pemilik, 500 obrolan terbaru).
163
- - **Memori proyek:** nonaktif sampai Anda mengaktifkannya. Saat aktif, setelah setiap giliran selesai di obrolan tingkat atas, bagian Host mengirim pesan baru obrolan itu sejak tinjauan terakhir (pesan Anda dan balasan teks agen; tanpa keluaran alat, penalaran, konteks tersembunyi, atau pesan yang ditarik oleh putar balik; salinan obrolan induk pada obrolan cabang tidak ikut; paling banyak sekitar 16.000 karakter) dan catatan yang tersimpan ke model obrolan itu sendiri, sebagai satu permintaan tanpa alat. Catatan berupa file Markdown di `$DSH_HOME/storages/dsh-composer-plus/memory/` (file khusus pemilik): `projects/<id>/` untuk setiap folder proyek (`<id>` adalah hash dari path asli folder; `project.json` mencatat foldernya), `global/`, `journal.jsonl` (setiap perubahan dengan baris sebelum dan sesudahnya), dan `reviewed.json` (sampai mana setiap obrolan dibaca). Tidak ada yang ditulis ke folder proyek. Catatan yang tampak seperti kunci, token, kata sandi, atau nomor identitas ditolak. Catatan sebuah proyek masuk ke prompt sistem setiap obrolan baru di folder itu, sehingga ikut ke model pada setiap permintaan obrolan itu. Sakelarnya ada di `memory.json` di tempat yang sama.
167
+ - **Lanjutkan di obrolan baru:** tidak ada yang berjalan sampai Anda mengkliknya. Lalu bagian Host mengirim obrolan (seperti yang dibaca Pemeriksaan tujuan: tanpa penalaran, tanpa langkah yang ditarik oleh putar balik) ke model obrolan itu sendiri dan menampilkan catatan serah terima; hanya **Mulai obrolan baru** yang membuat obrolan baru. Tidak ada yang ditulis ke proyek.
168
+ - **Rincian konteks:** bagian Host hanya membaca log obrolan; tanpa panggilan model, tanpa file proyek.
169
+ - **File yang dilindungi:** daftar dan sakelarnya ada di `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (file hanya untuk pemilik). Pemeriksaan hanya membaca path dari setiap panggilan alat file (dan path aslinya), tidak pernah membaca file itu.
170
+ - **Memori proyek:** nonaktif sampai Anda mengaktifkannya. Saat aktif, setelah setiap giliran selesai di obrolan tingkat atas, bagian Host mengirim pesan baru obrolan itu sejak tinjauan terakhir (pesan Anda dan balasan teks agen; tanpa keluaran alat, penalaran, konteks tersembunyi, atau pesan yang ditarik oleh putar balik; salinan obrolan induk pada obrolan cabang tidak ikut; paling banyak sekitar 16.000 karakter) dan catatan yang tersimpan ke model obrolan itu sendiri, sebagai satu permintaan tanpa alat. Catatan berupa file Markdown di `$DSH_HOME/storages/dsh-composer-plus/memory/` (file khusus pemilik): `projects/<id>/` untuk setiap folder proyek (`<id>` adalah hash dari path asli folder; `project.json` mencatat foldernya), `global/`, `journal.jsonl` (setiap perubahan dengan baris sebelum dan sesudahnya), dan `reviewed.json` (sampai mana setiap obrolan dibaca). Tidak ada yang ditulis ke folder proyek. Catatan yang tampak seperti kunci, token, kata sandi, atau nomor identitas ditolak. Catatan sebuah proyek masuk ke prompt sistem setiap obrolan baru di folder itu, sehingga ikut ke model pada setiap permintaan obrolan itu. Sakelarnya ada di `memory.json` di tempat yang sama. **Buka memori** tidak mengirim apa pun sampai Anda menekan **Pratinjau perubahan**; lalu ia mengirim catatan yang ditampilkan dan teks Anda ke model default dsh, sebagai satu permintaan tanpa alat. Perubahan hanya ditulis saat **Terapkan**, dengan `editor` di jurnal. Tether membaca dan mengubah catatan melalui rute yang sama.
164
171
  - **Pencadangan:** tidak ada yang keluar dari komputer Anda. Arsip disimpan di `~/Desktop/dsh-backups` (file hanya untuk pemilik). Rahasia tidak ada di dalam arsip: file kredensial (`.credentials.yaml`, `.env`), file kunci (`.pem`, `.key`, `.p12`, `.pfx`), serta nilai pengaturan token, secret, password, dan kunci API di file yml disamarkan; salinan aslinya tetap ada di `composer-plus-vault/<archive>/` di folder yang sama (hanya untuk pemilik), hanya di komputer ini. **Untuk komputer lain** tidak menyalin vault: masukkan lagi rahasia itu di sana. Log obrolan, pengaturan, dan isi dsh home lainnya masuk ke arsip apa adanya: jaga folder itu tetap privat, sama seperti `$DSH_HOME` itu sendiri. Pencadangan membaca file dengan `O_NOFOLLOW | O_NONBLOCK`; symlink disimpan sebagai tautan (tidak pernah diikuti), dan FIFO atau perangkat dilewati. Sakelar dan pengaturan pencadangan otomatis ada di `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, sakelar konsol penyelamat di `rescue-console.json`, dan selama dsh berjalan, `running/host-<pid>.json` menyebut setiap proses dsh (konsol penyelamat membaca file-file itu untuk menolak pemulihan).
165
172
  - **Konsol penyelamat:** menu terminal; konsol ini tidak membuka port jaringan. Pemulihan hanya menulis ke folder baru di sebelah dsh home (file dengan `O_EXCL | O_NOFOLLOW`, symlink paling akhir dan tidak pernah diikuti) dan menolak arsip dengan nama yang tidak aman (`..`, jalur absolut), perangkat atau FIFO, lebih dari satu folder teratas, atau entri di bawah tautan.
166
173
 
@@ -182,7 +189,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
182
189
  - **Tidak ada label branch di baris obrolan:** obrolan itu belum memiliki giliran sejak Anda memasang versi ini, foldernya bukan repositori git, atau **Branch Git di baris obrolan** nonaktif. Setelah pembaruan, mulai ulang dsh (bagian Host mencatat branch).
183
190
  - **Pemeriksaan tujuan menyebut pengujian keluar dengan kode 127 atau "not found":** dsh yang dimulai dari Finder atau Dock dapat memiliki PATH yang lebih pendek daripada terminal Anda, sehingga tidak menemukan `npm`, `pnpm`, atau `cargo`. Mulai dsh dari terminal, atau atur perintah pengujian Anda sendiri dengan jalur lengkap di **Pemeriksaan tujuan** → **Edit**. **Jalankan sekarang** langsung menampilkan hasilnya.
184
191
  - **Tujuan tidak ditutup dan agen terus bekerja:** **Pemeriksaan tujuan** menemukan pengujian yang gagal atau pekerjaan yang belum selesai; baris di bawah tujuan menampilkan alasannya (arahkan penunjuk ke hasil untuk melihat detailnya). Perbaiki penyebabnya atau perintah pengujiannya, atau selesaikan tujuan sendiri dengan `/goal` atau bilah tujuan (penyelesaian itu tidak diperiksa).
185
- - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.16.1`), lihat catatan pemasangan di atas.
192
+ - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.17.0`), lihat catatan pemasangan di atas.
186
193
  - **Cadangkan sekarang menyatakan "Tindakan pencadangan lain sedang berjalan":** ada tindakan yang berjalan di jendela dsh lain atau di konsol penyelamat (keduanya berbagi file kunci, `.composer-plus.lock`, di folder cadangan). Tunggu sampai tindakan itu selesai. Jika tidak ada tindakan yang berjalan, kunci milik proses yang sudah ditutup diambil alih pada klik berikutnya.
187
194
  - **Konsol penyelamat menyatakan "dsh is running":** keluar dari dsh terlebih dahulu. Jika dsh memang sudah tertutup, file yang disebut dalam pesan itu tersisa dari crash: hapus file itu dan coba lagi.
188
195
  - **Setelah pemulihan, dsh tidak mau dimulai atau ada plugin yang hilang:** paket plugin sebuah profil harus dipasang lagi. Konsol penyelamat menawarkannya setelah pemulihan; atau jalankan `pnpm install` di setiap folder di bawah `$DSH_HOME/profiles/` yang dicantumkannya. Rahasia yang tidak ada di vault (komputer lain) harus dimasukkan lagi: konsol mencantumkannya.
@@ -205,6 +212,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
205
212
  - **Izinkan untuk obrolan ini** menghitung batas waktu sejak izin diberikan. Batas waktu baru langsung berlaku untuk izin yang sedang berjalan, jadi batas yang lebih pendek dapat langsung mengakhirinya. Izin dari versi 1.12 dan sebelumnya tidak memiliki waktu: setelah pembaruan, agen bertanya sekali lagi untuk alat-alat itu.
206
213
  - **Pertahankan fokus composer** mengembalikan fokus hanya setelah perintah `/` atau skill. Saat dsh memproses perintah, kotak pesan tetap hanya-baca selama beberapa milidetik, jadi tombol yang ditekan dalam waktu itu hilang. Jika menu `/` dsh masih terbuka, `Enter` memilih baris yang disorot dan tidak mengirim.
207
214
  - **Sesuaikan kartu pertanyaan dengan jendela** hanya mengubah kartu pertanyaan dsh, bukan kartu tinjauan rencana. Fitur ini menemukan kartu melalui markup dsh (`data-question-key`, `data-question-scroll`); jika pembaruan dsh mengubah markup itu, kartu tampil seperti yang digambar dsh. Tinggi kartu mengikuti jendela, bukan chat: di chat dalam panel samping yang sempit, kartu yang tinggi masih dapat melewati bagian atas chat.
215
+ - **Sesuaikan header chat dengan jendela** menemukan header chat dsh dari nama kelas yang dibuat dsh (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), karena dsh tidak menyediakan kait tata letak untuknya. Jika pembaruan dsh mengganti nama itu, header tampil seperti yang digambar dsh. Di kolom chat yang sangat sempit header bisa memakai dua atau tiga baris, sehingga ruang di atas pesan menjadi lebih kecil.
208
216
  - **Koneksi seluler** hanya berfungsi di macOS (memakai `en0`, `openssl`, `swift`, dan `dns-sd`). Fitur ini memakai port tetap 19390 dan 19391, jadi hanya satu dsh di setiap Mac yang dapat menjalankannya pada satu waktu (setiap Mac adalah satu entri dalam daftar Mac di ponsel). Ponsel hanya mendapat notifikasi saat Tether terbuka atau baru saja masuk ke latar belakang (tidak ada layanan push). Tether hanya mengirimnya setelah Anda mengaktifkan "Settings → Notifications → Send notifications" di Tether. Opsi ini nonaktif secara default, dan iOS meminta izin saat Anda mengaktifkannya. Aplikasi iOS belum ada di App Store: bangun aplikasi itu dari `tether/ios` dengan Xcode. "Tailscale only" tetap memerlukan alamat Wi-Fi atau Ethernet di Mac (gateway hanya mulai jika ada alamat itu). Log akses terpisah untuk setiap Mac dan hanya menyimpan 200 percobaan terbaru; percobaan yang berulang dalam satu menit menambah hitungan satu pada baris yang sama. Kunci aplikasi Tether tidak menyembunyikan pratinjau notifikasi di Layar Terkunci iPhone: matikan pratinjau itu di Pengaturan iOS. Titik hijau di Tether mengikuti Mac: chat yang Anda buka di dsh juga kehilangan titiknya di ponsel. Chat yang Anda buka di Tether hanya kehilangan titiknya di ponsel. Titik milik dsh di Mac tetap ada sampai Anda membuka chat itu di Mac.
209
217
  - Tautan sesi berfungsi di dalam obrolan; mengkliknya tidak membuka obrolan. Tautan dari **Salin tautan pesan** membuka pesannya hanya di dsh 0.2.1 dan yang lebih baru, dan hanya dari pesan di obrolan (dsh 0.2.0 tidak punya aturan teks pengguna, jadi di sana tautan tetap disalin, tetapi tampil sebagai teks biasa). Pesan yang dikeluarkan oleh putar balik, atau yang dihapus oleh pemadatan dari riwayat yang dimuat dsh, tidak dapat ditampilkan: tautan lalu memberi tahu hal itu. Tombol 🔗 menempel ke baris pesan dsh; jika pembaruan dsh mengubah markup itu, tombol tidak tampil.
210
218
  - **Tandai semua sudah dibaca** mengubah titik belum dibaca milik dsh melalui bagian dsh yang bukan API publik (daftar `completionUnread` di status sesi dsh). Jika pembaruan dsh mengganti namanya, item ini tidak tampil. Item ini masuk ke menu "…" proyek di dsh, yang tidak punya slot untuk plugin; jika dsh mengubah menu itu, item ini juga tidak tampil.
@@ -219,7 +227,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
219
227
  - **Branch per obrolan**: saat folder branch sebuah obrolan (`<project>/.worktrees/<name>`) dihapus, misalnya saat agen obrolan itu sendiri menghapus worktree dan branch-nya, langkah berikutnya dari obrolan memindahkan obrolan keluar dari folder itu. Proyek folder branch hilang dari bilah samping, dan obrolan tampil di bawah Tanpa grup dan tetap terbuka. Di dsh 0.2.1 dan yang lebih baru, obrolan berlanjut di folder utama proyek, dan model mendapat catatan tentang folder baru. Di dsh 0.2.0, obrolan tetap memakai folder yang dihapus: perintah di sana gagal sampai Anda memulai obrolan baru. Proyek dari branch yang dihapus dan tidak dipakai obrolan mana pun juga hilang dari bilah samping: Composer Plus memeriksa folder branch saat mulai dan setiap 30 detik, juga tanpa filter bilah samping. Selama obrolan dipindahkan, **Branch baru** di repositori yang sama menjawab "coba lagi". Saat sakelar mati, galat dsh sendiri muncul lagi ("working-directory: directory does not exist").
220
228
  - **Branch di pohon ruang kerja** menulis ke git tanpa klik: saat memindahkan obrolan, fitur ini mengembalikan folder proyek ke branch sebelumnya (`git switch`) dan menambahkan worktree (`git worktree add`). Fitur ini tidak pernah menghapus branch, worktree, atau file. dsh tidak bisa mengganti folder sebuah obrolan, jadi obrolan yang dipindahkan adalah salinan (fork milik dsh sendiri, dengan id baru) dan obrolan lama diarsipkan. Salinan melanjutkan tugas yang berhenti; panggilan alat yang sedang berjalan saat branch muncul berakhir dengan penolakan, dan agen menjalankannya lagi di folder baru. Tujuan (goal) obrolan lama tidak ikut pindah. Hanya obrolan yang foldernya adalah folder utama repositori yang dipindahkan, dan hanya untuk branch yang dibuatnya dan dipindahinya pada giliran itu (`git switch -c`, `git checkout -b`): branch yang dibuat hanya dengan `git branch`, folder dengan perubahan yang belum di-commit, worktree tertaut, atau subfolder tidak memindahkan apa pun. Di pohon hanya tampil worktree yang langsung berada di `<project>/.worktrees/` dan punya branch; worktree terlepas (detached) atau di tempat lain tidak tampil. Salinan terbuka sendiri hanya jika obrolannya adalah obrolan yang sedang terbuka (plugin membacanya dari baris bilah samping dsh); jika tidak, salinan ada di proyek branch.
221
229
  - **Cari di obrolan** hanya mencari apa yang ditampilkan halaman: pesan dan balasan yang sudah dimuat (gulir ke atas atau klik **Muat yang lebih lama** untuk yang lebih lama), bukan langkah alat yang tertutup dan bukan teks yang terlipat di dalam output alat. Fitur ini menghitung paling banyak 2.000 kecocokan (lalu "2000+"). Fitur ini memakai API sorotan browser (Chromium 105 dan yang lebih baru; aplikasi desktop memilikinya): di browser yang lebih lama, jumlah dan perpindahan tetap berfungsi tanpa warna. `Cmd+F` di Mac (`Ctrl+F` di Windows dan Linux) hanya membukanya saat ada obrolan di layar; di tempat lain, pencarian bawaan browser berfungsi seperti biasa. Di Mac, `Ctrl+F` tetap menjalankan fungsi macOS-nya di kolom teks (kursor maju satu karakter).
222
- - **Buka obrolan yang menunggu saat tidak aktif** hanya mengetahui apa yang dilihat jendela dsh: pekerjaan di aplikasi lain tidak dihitung, jadi saat dsh berada di latar belakang, fitur ini dapat membuka obrolan yang menunggu setelah 30 detik. dsh tidak dibawa ke depan. Membaca tanpa menekan tombol, mengklik, atau menggerakkan mouse dihitung sebagai tidak aktif. Fitur ini hanya melihat obrolan dengan titik oranye dsh (pertanyaan, persetujuan, atau tinjauan rencana); permintaan subagen tampil di obrolan induknya. Selama obrolan yang menunggu ada di layar, obrolan lain tidak dibuka; obrolan yang Anda tinggalkan tanpa jawaban dapat terbuka lagi setelah 30 detik berikutnya tanpa penggunaan. Waktu 30 detik tidak dapat diubah.
230
+ - **Buka obrolan yang menunggu saat tidak aktif** hanya mengetahui apa yang dilihat jendela dsh: pekerjaan di aplikasi lain tidak dihitung, jadi saat dsh berada di latar belakang, fitur ini dapat membuka obrolan yang menunggu setelah 30 detik. dsh tidak dibawa ke depan. Membaca tanpa menekan tombol, mengklik, atau menggerakkan mouse dihitung sebagai tidak aktif. Fitur ini hanya melihat obrolan dengan titik oranye dsh (pertanyaan, persetujuan, atau tinjauan rencana) atau titik hijau (giliran selesai yang belum Anda buka); permintaan subagen tampil di obrolan induknya. Obrolan oranye dibuka lebih dulu. Membuka obrolan hijau menghapus titiknya, jadi 30 detik untuk obrolan hijau berikutnya baru dimulai setelah tombol, klik, gerakan mouse, roda gulir, atau sentuhan Anda berikutnya: saat Anda kembali, titik hijau lainnya masih ada. Selama obrolan yang menunggu ada di layar, obrolan lain tidak dibuka; obrolan yang Anda tinggalkan tanpa jawaban dapat terbuka lagi setelah 30 detik berikutnya tanpa penggunaan. Waktu 30 detik tidak dapat diubah.
223
231
  - Notifikasi yang dikirim sebelum mulai ulang hanya membawa dsh ke depan saat diklik.
224
232
  - Proyek aktif dipindahkan dengan urutan proyek tersimpan milik dsh, jadi urutan baru tetap ada setelah mulai ulang. Obrolan di luar proyek mana pun ("Tanpa grup") tidak dapat dipindahkan; dsh selalu menampilkannya paling akhir.
225
233
  - dsh tidak memiliki titik ekstensi di menu opsi tampilan bilah samping, jadi opsi proyek terbaru ditambahkan ke menu bawaan dsh. Jika pembaruan dsh mengubah menu itu, opsi ini tidak ditampilkan dan semua proyek tetap terlihat. Filter bekerja pada baris proyek, jadi **Dalam satu daftar** tidak difilter. Dalam **Pohon Ruang Kerja**, folder induk tetap terlihat selama ada proyek aktif di dalamnya, dan baris obrolan yang tidak aktif dalam 2 jam terakhir juga disembunyikan; dalam **Ruang Kerja**, hanya baris proyek yang difilter. Filter membaca tampilan yang dipakai dsh dari pengaturan tampilan yang disimpan dsh (bukan API publik); jika pembaruan dsh mengganti namanya, **Pohon Ruang Kerja** difilter seperti **Ruang Kerja**. Status proyek membaca pengaturan yang sama: dalam **Pohon Ruang Kerja**, baris folder induk juga menghitung obrolan dari proyek di dalamnya; jika dsh mengganti nama pengaturan itu, setiap baris hanya menampilkan obrolannya sendiri. **Menurut status** memiliki batasan serupa: dsh tidak memiliki slot urutan, jadi item dan urutan baris menempel ke markup menu dan daftar dsh.
@@ -228,10 +236,13 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
228
236
  - dsh juga tidak punya titik ekstensi yang memilih tempat **Sesi Baru** terbuka. **Ruang kerja default untuk Sesi Baru** membungkus metode dsh yang bukan API publik (`startSession` dari layanan ruang kerja dsh). Jika pembaruan dsh mengganti namanya, **Sesi Baru** terbuka di tempat yang dipilih dsh (proyek yang terbuka atau yang terbaru). Setiap panggilan yang tidak menyebut proyek memakai default: tombol sidebar, pintasannya, logo, dan juga **Baru** di halaman **Tugas otomatisasi**. dsh tetap membuka obrolan terakhir saat mulai. Folder umum dibuat dan ditambahkan ke proyek Anda pada penggunaan pertama; di Windows atau Linux dengan folder Documents yang dipindahkan, folder ini bisa berbeda dari folder milik dsh.
229
237
  - dsh juga tidak memiliki titik ekstensi untuk petunjuk di kotak pesan, jadi teks **Prediksi pesan berikutnya** ditampilkan di atas teks placeholder milik dsh (`[data-composer-placeholder]`). Jika pembaruan dsh mengubah markup itu, prediksi tidak ditampilkan. Selama fitur ini aktif, setiap giliran yang selesai memakai satu panggilan model singkat.
230
238
  - **Lengkapi saat mengetik** menampilkan teksnya melalui petunjuk kotak pesan milik dsh sendiri (gaya `--dsh-composer-hint` yang dipakai dsh untuk petunjuk argumen perintah garis miring). Fitur ini tidak berjalan untuk perintah garis miring, pesan dengan chip file atau simbol, atau saat kursor tidak berada di akhir pesan. Jika pembaruan dsh mengubah gaya itu, pelengkapan tidak ditampilkan. Setiap jeda saat Anda mengetik memakai satu panggilan model.
231
- - **Sempurnakan prompt** hanya melihat ringkasan proyek yang singkat, jalur yang berubah, dan jalur yang namanya cocok dengan kata-kata Anda: bukan kodenya sendiri. Jadi fitur ini bisa melewatkan file yang tepat, dan hanya menyebut jalur yang diberikan kepadanya. Baca teks baru sebelum Anda mengirimnya. Fitur ini tidak berjalan untuk perintah garis miring atau pesan dengan chip file atau simbol (teks baru adalah teks biasa, jadi chip itu akan hilang), dan sebuah pesan paling banyak 8.000 karakter. Gambar tetap terlampir: hanya teksnya yang berubah. Setiap klik memakai satu panggilan model; model yang kuat bisa memerlukan satu menit (`Esc` membatalkannya).
232
- - **Pemeriksaan tujuan** hanya memeriksa penyelesaian yang dibuat agen dalam putaran tujuan otomatis: penyelesaian yang Anda minta di obrolan, `/goal`, dan bilah tujuan tidak diperiksa. Agen dapat mengubah sendiri pengujian atau file perintah pengujian; pemeriksa membaca obrolan dan dapat melihatnya, tetapi bisa salah ke dua arah ("belum selesai" yang salah memakai satu putaran lagi; "selesai" yang salah menutup tujuan). Pemeriksa melihat obrolan dan `git status`, bukan kodenya sendiri. Satu kali menjalankan pengujian hanya dipakai ulang jika langkah terbaru agen yang dapat mengubah file adalah eksekusi `bash` milik agen sendiri yang lulus, dengan perintah yang persis sama di folder yang sama; perintah dengan pipe (`| tail`) atau `&&` tidak dipakai ulang. Anggaran diukur saat sebuah giliran berakhir, jadi satu giliran bisa melampauinya. Hanya panggilan model milik obrolan itu sendiri yang dihitung (bukan milik subagennya). `update_goal` menunggu selama pemeriksaan berjalan (pengujian paling lama 15 menit, pemeriksa paling lama 3 menit). Obrolan hasil pencabangan mendapat id obrolan baru, jadi dimulai tanpa perintah pengujian dan batas milik obrolan induknya. Setiap penyelesaian yang mencapai pemeriksa memakai satu panggilan model.
239
+ - **Sempurnakan prompt** hanya melihat ringkasan proyek yang singkat, jalur yang berubah, dan jalur yang namanya cocok dengan kata-kata Anda: bukan kodenya sendiri. Jadi fitur ini bisa melewatkan file yang tepat, dan hanya menyebut jalur yang diberikan kepadanya. Baca teks baru sebelum Anda mengirimnya. Fitur ini tidak berjalan untuk perintah garis miring selain `/goal <tujuan>`, untuk kata kontrol `/goal` (`clear`, `pause`, `resume`), atau untuk pesan dengan chip file atau simbol (teks baru adalah teks biasa, jadi chip itu akan hilang), dan sebuah pesan paling banyak 8.000 karakter. Untuk tujuan `/goal`, fitur ini menulis syarat hanya dari draf dan konteks; syarat yang terlalu ketat bisa memakai putaran tujuan, jadi baca syarat itu sebelum Anda mengirimnya. Gambar tetap terlampir: hanya teksnya yang berubah. Setiap klik memakai satu panggilan model; model yang kuat bisa memerlukan satu menit (`Esc` membatalkannya).
240
+ - **Pemeriksaan tujuan** hanya memeriksa penyelesaian yang dibuat agen dalam putaran tujuan otomatis: penyelesaian yang Anda minta di obrolan, `/goal`, dan bilah tujuan tidak diperiksa. Agen dapat mengubah sendiri pengujian atau file perintah pengujian; pemeriksa membaca obrolan dan dapat melihatnya, tetapi bisa salah ke dua arah ("belum selesai" yang salah memakai satu putaran lagi; "selesai" yang salah menutup tujuan). Pemeriksa melihat obrolan dan `git status`, bukan kodenya sendiri. Satu kali menjalankan pengujian hanya dipakai ulang jika langkah terbaru agen yang dapat mengubah file adalah eksekusi `bash` milik agen sendiri yang lulus, dengan perintah yang persis sama di folder yang sama; perintah dengan pipe (`| tail`) atau `&&` tidak dipakai ulang. Anggaran diukur saat sebuah giliran berakhir, jadi satu giliran bisa melampauinya. Anggaran token juga menghitung panggilan obrolan subagen milik obrolan itu (dibaca dari log tersimpan mereka di setiap akhir giliran, jadi obrolan dengan banyak subagen perlu waktu sedikit lebih lama untuk diperiksa). Tabel bukti berasal dari bacaan pemeriksa sendiri atas obrolan: bagian yang disebutnya terverifikasi tetap perlu Anda lihat sendiri jika bagian itu penting. `update_goal` menunggu selama pemeriksaan berjalan (pengujian paling lama 15 menit, pemeriksa paling lama 3 menit). Obrolan hasil pencabangan mendapat id obrolan baru, jadi dimulai tanpa perintah pengujian dan batas milik obrolan induknya. Setiap penyelesaian yang mencapai pemeriksa memakai satu panggilan model.
241
+ - **File yang dilindungi** adalah pagar pengaman, bukan sandbox. Fitur ini mencakup alat file milik dsh sendiri (`read`, `read_image`, `grep` pada file, `write`, `edit`, `str_replace_editor`). Perintah shell (`cat .env`), skrip yang ditulis agen, shell milik subagen, alat MCP, daftar `glob`, dan `grep` pada seluruh folder tetap dapat menjangkau file yang dilindungi. Untuk batas yang sebenarnya, gunakan mode sandbox dsh atau simpan rahasia di luar folder proyek. Pola mengenal `*`, `**`, dan `?`, tidak mengenal `{a,b}` atau `[ab]`, dan tidak membedakan huruf besar-kecil.
242
+ - **Lanjutkan di obrolan baru** mengirim obrolan (pesan, panggilan alat, dan bagian akhir setiap hasil alat, paling banyak sekitar 60.000 karakter, bagian terbaru) ke model obrolan itu sendiri. Catatan serah terima bisa melewatkan sebuah keputusan atau file: baca catatan itu sebelum Anda memulai. Obrolan baru hanya mengetahui catatan dan obrolan yang ditautkan (dsh melampirkan obrolan lama sebagai konteks hanya-baca); konteks modelnya dimulai kecil, dan obrolan lama tetap seperti apa adanya. Hanya satu catatan atau satu mulai per obrolan pada satu waktu.
243
+ - **Rincian konteks** menampilkan perkiraan dengan aturan milik dsh sendiri (sekitar 4 karakter per token), aturan yang sama dengan cincin konteks dsh; hitungan model itu sendiri bisa berbeda. Definisi alat adalah definisi dari permintaan terbaru. Fitur ini menampilkan konteks seperti yang ada di log obrolan; giliran yang sedang berjalan muncul setelah langkah berikutnya.
233
244
  - **Dahulukan pesan setelah Hentikan** hanya bekerja setelah Anda menghentikan obrolan (atau setelah giliran yang gagal, atau saat Anda membuka obrolan yang masih punya antrean): pesan yang Anda kirim saat sebuah giliran berjalan tetap menunggu di akhir antrean. Pesan itu hanya mendahului pesan antrean milik Anda sendiri: jika ada putaran tujuan atau balasan pertanyaan yang menunggu di antrean, urutan dsh tetap. Fitur ini membaca bagian dsh yang bukan API publik (apakah giliran yang dihentikan masih sedang berakhir); jika pembaruan dsh mengganti namanya, pesan baru dipindah ke depan setelah giliran itu selesai. Obrolan subagen tetap memakai urutan dsh.
234
- - **Memori proyek** milik folder pertama obrolan (folder proyek dsh): obrolan yang mengganti foldernya dengan `cd` tetap memakai memori proyek pertamanya, dan folder yang sama yang dibuka lewat path lain ke file yang sama memakai memori yang sama. Obrolan membekukan bagian memorinya saat dimulai, jadi catatan yang disimpan kemudian muncul mulai obrolan berikutnya (`memory_recall` langsung menemukannya). Tinjauan hanya menyimpan apa yang diputuskan model: tinjauan bisa melewatkan fakta atau menyimpan yang salah; buka file-nya untuk memeriksa, lalu edit atau hapus secara manual saat dsh tertutup. Setiap giliran selesai yang berisi pesan dari Anda memakan satu panggilan model; panggilan yang gagal membaca pesan yang sama lagi setelah giliran berikutnya. Obrolan subagen tidak ditinjau. Ide dan format file berasal dari [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus tidak memakai kodenya dan tidak pernah membaca atau menulis memori milik DS Bot sendiri.
245
+ - **Memori proyek** milik folder pertama obrolan (folder proyek dsh): obrolan yang mengganti foldernya dengan `cd` tetap memakai memori proyek pertamanya, dan folder yang sama yang dibuka lewat path lain ke file yang sama memakai memori yang sama. Obrolan membekukan bagian memorinya saat dimulai, jadi catatan yang disimpan kemudian muncul mulai obrolan berikutnya (`memory_recall` langsung menemukannya). Tinjauan hanya menyimpan apa yang diputuskan model: tinjauan bisa melewatkan fakta atau menyimpan yang salah; periksa di **Buka memori** dan ubah di sana, atau edit file-nya secara manual saat dsh tertutup. **Buka memori** mengirim catatan proyek yang dipilih dan catatan global (semua proyek saat Anda memilih Semua catatan; paling banyak sekitar 60.000 karakter, sisanya hanya dihitung dan tidak dapat diubah dalam permintaan itu) serta teks Anda ke model default dsh, bukan ke model obrolan. Pratinjau disimpan di Mac selama 30 menit dan sampai dsh dimulai ulang; jika tinjauan atau agen mengubah catatan di antaranya, **Terapkan** menolak dan Anda meminta pratinjau lagi. **Terapkan** menyimpan semua perubahan dari satu pratinjau atau tidak sama sekali: jika satu perubahan tidak bisa disimpan (misalnya MEMORY.md sudah penuh), catatan tetap seperti semula dan alasannya ditampilkan. Setiap giliran selesai yang berisi pesan dari Anda memakan satu panggilan model; panggilan yang gagal membaca pesan yang sama lagi setelah giliran berikutnya. Obrolan subagen tidak ditinjau. Ide dan format file berasal dari [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus tidak memakai kodenya dan tidak pernah membaca atau menulis memori milik DS Bot sendiri.
235
246
  - **Pencadangan** memakai satu folder tetap, `~/Desktop/dsh-backups` (default dsh-backup, sehingga arsipnya tetap dapat dipakai); tidak ada pengaturan untuk folder lain. Ukuran arsip kurang lebih sama dengan dsh home tanpa `cache/` dan `dsh-runtimes/` (diukur: file sebesar 1,6 GB menghasilkan arsip 830 MB dalam sekitar 30 detik di Apple Silicon; dsh tetap responsif). File yang berubah saat dibaca disimpan seperti saat pencadangan membukanya, sehingga log obrolan yang terbuka dapat berakhir dengan catatan yang terpotong, yang diperbaiki dsh pada penulisan berikutnya. Penyamaran menemukan rahasia di file yml dari nama kuncinya dalam satu baris (`token:`, `apiKey:`, …); rahasia dalam flow map (`{token: x}`), dalam daftar di bawah kunci seperti itu, dalam file JSON (misalnya `apiKey` milik server MCP di file `.json`), atau dengan nama lain tetap ada di arsip. Arsip per jenis milik dsh-backup (`dsh-t-…`) tidak dicantumkan. **Untuk komputer lain** menyalin arsip (klon di APFS: tanpa ruang tambahan); vault tidak ikut. **Cadangkan sekarang** tidak menghapus cadangan apa pun. Pencadangan otomatis menyimpan cadangan terbaru yang dibuat Composer Plus (pengaturan **Simpan** di **Pencadangan otomatis**) dan menghapus cadangannya yang lebih lama; snapshot sebelum peningkatan dihitung terpisah (2 yang terbaru tetap ada). Arsip dsh-backup tidak pernah dihapus: hapus arsip itu dengan **Hapus**. Selama dsh-backup masih terpasang, dsh-backup menghitung arsip Composer Plus dalam jumlah simpanannya sendiri dan dapat menghapusnya.
236
247
  - **Pemulihan:** hanya berjalan di konsol penyelamat, saat dsh ditutup, dan menggantikan seluruh dsh home. dsh home yang lama tetap ada di sebelahnya sebagai `.dsh.pre-restore-<time>` sampai Anda menghapusnya, jadi disk perlu ruang untuk keduanya. Obrolan tetap memakai jalur proyeknya: di komputer lain, proyek di jalur lain tampil sebagai hilang sampai Anda menambahkannya lagi. Symlink yang menunjuk ke luar dsh home (misalnya skill yang ditautkan dari folder lain) kembali sebagai tautan; targetnya harus ada di komputer itu.
237
248
  - **Pemeriksaan log sesi** membaca log terbaru setiap obrolan dengan aturan dsh sendiri tentang apa yang dapat dibuka: baris yang bukan JSON atau yang tidak berurutan dihitung sebagai kerusakan hanya jika ada akhir giliran sesudahnya (jika tidak, dsh membuka obrolan tanpa baris mulai dari situ, sehingga obrolan itu tidak dicantumkan). Fitur ini tidak memeriksa peristiwa dalam log terhadap aturan peristiwa milik dsh sendiri, jadi log yang dianggapnya sehat masih bisa gagal dibuka setelah dsh ditingkatkan. Perbaikan mengambil salinan dari cadangan: pesan setelah cadangan itu hilang dari obrolan tersebut (file yang rusak tetap ada di sebelahnya). Obrolan yang terbuka di dsh ini tidak diperbaiki di Pengaturan: dsh sedang memegangnya.
@@ -264,7 +275,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
264
275
 
265
276
  **Bisakah agen berhenti menandai pekerjaannya sendiri sebagai selesai, seperti loop pemeriksa dalam loop engineering?** Bisa, dengan **Pemeriksaan tujuan** (aktif secara default): mulai tujuan dengan `/goal`. Saat agen mengatakan tujuan sudah selesai, pengujian proyek dijalankan dan satu panggilan model independen memeriksa tujuan terhadap obrolan; jika salah satunya gagal, tujuan tetap terbuka dan agen membaca alasannya. Atur perintah pengujian Anda sendiri, batas waktu, atau batas token dengan **Edit** di baris **Pemeriksaan tujuan** di bawah tujuan.
266
277
 
267
- **Bisakah agen mengingat preferensi saya antar-obrolan, seperti memori DS Bot?** Bisa, dengan **Memori proyek** (nonaktif secara default): aktifkan di **Pengaturan → Composer Plus**. Setelah setiap giliran, preferensi dan keputusan Anda yang bertahan lama disimpan sebagai catatan singkat untuk proyek obrolan itu, dan setiap obrolan baru di proyek itu membacanya. Minta agen mengingat sesuatu, dan agen langsung menyimpannya.
278
+ **Bisakah agen mengingat preferensi saya antar-obrolan, seperti memori DS Bot?** Bisa, dengan **Memori proyek** (nonaktif secara default): aktifkan di **Pengaturan → Composer Plus**. Setelah setiap giliran, preferensi dan keputusan Anda yang bertahan lama disimpan sebagai catatan singkat untuk proyek obrolan itu, dan setiap obrolan baru di proyek itu membacanya. Minta agen mengingat sesuatu, dan agen langsung menyimpannya. Untuk melihat atau mengubah catatan, klik **Buka memori** di baris yang sama dan tulis apa yang diubah.
268
279
 
269
280
  **Bisakah dsh mencadangkan obrolan dan pengaturan saya, seperti dsh-backup?** Bisa: **Pengaturan → Composer Plus → Pencadangan → Cadangkan sekarang**. Fitur ini menulis format arsip yang sama ke folder yang sama (`~/Desktop/dsh-backups`), jadi arsip dsh-backup juga tampil dan dapat dipulihkan, dan Anda dapat menghapus dsh-backup. Aktifkan **Pencadangan otomatis** untuk pencadangan terjadwal.
270
281
 
@@ -304,7 +315,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
304
315
 
305
316
  **Bagaimana cara mendapatkan notifikasi macOS / Windows saat tugas dsh selesai atau memerlukan persetujuan?** Biarkan **Notifikasi latar belakang** aktif (default) dan izinkan notifikasi untuk DeepSeek Harness di pengaturan OS.
306
317
 
307
- **Bisakah dsh membuka sendiri obrolan yang mengajukan pertanyaan kepada saya?** Ya, dengan **Buka obrolan yang menunggu saat tidak aktif** (aktif secara default): saat obrolan menunggu jawaban, persetujuan, atau tinjauan rencana dan Anda tidak menggunakan dsh selama 30 detik, dsh membukanya. Selama Anda mengetik, menggulir, atau menggerakkan mouse, fitur ini menunggu.
318
+ **Bisakah dsh membuka sendiri obrolan yang mengajukan pertanyaan kepada saya?** Ya, dengan **Buka obrolan yang menunggu saat tidak aktif** (aktif secara default): saat obrolan menunggu jawaban, persetujuan, atau tinjauan rencana dan Anda tidak menggunakan dsh selama 30 detik, dsh membukanya. Obrolan yang menyelesaikan giliran yang belum Anda baca (titik hijau) dibuka dengan cara yang sama, setelah obrolan oranye. Selama Anda mengetik, menggulir, atau menggerakkan mouse, fitur ini menunggu.
308
319
 
309
320
  **Bagaimana cara mengganti antarmuka DeepSeek Harness ke bahasa Turki, Spanyol, Jepang…?** Pengaturan → Composer Plus → **Bahasa aplikasi**.
310
321
 
@@ -343,6 +354,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
343
354
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
344
355
  # Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
345
356
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
357
+ # Fit chat header to window (fake model, subagent + background jobs, branch pill, grants chip): no overlap from 1280 to 320 px, wide header unchanged + its thumbnail
358
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-header-fit.mjs /path/to/dsh/lib/bin.js
346
359
  # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
347
360
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
348
361
  # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not