dsh-composer-plus 1.20.0 → 1.21.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.20.0`.
32
+ > pnpm milik dsh melewati versi yang berumur kurang dari 24 jam. Tepat setelah rilis, tambahkan versinya: `dsh-composer-plus@1.21.0`.
33
33
 
34
34
  ## Fitur
35
35
 
@@ -71,9 +71,21 @@ Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil
71
71
  | **Langkah terencana** | <a id="feature-plannedsteps"></a>Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Agen mendapat alat `plan_next_steps`: dalam pesan yang sama dengan sebuah perintah, agen dapat merencanakan perintah berikutnya beserta argumen persisnya dan sebuah syarat, misalnya “jalankan `npm test` jika build berhasil”. Jika hasilnya memenuhi syarat, Composer Plus menjalankan langkah berikutnya sendiri tanpa panggilan model baru, sehingga obrolan panjang memakai lebih sedikit token. Langkah itu muncul di obrolan sebagai satu baris pendek, “Composer Plus · Planned steps: ran `test` … without a model call”, diikuti panggilan alat dan hasilnya. Hanya langkah `bash`, `read`, `grep`, dan `glob`; persetujuan, sandbox, dan File yang dilindungi berlaku untuk setiap langkah seperti biasa. Model menjawab lagi saat syarat tidak terpenuhi, saat dua langkah siap bersamaan, setelah langkah terakhir, dan saat Anda mengirim pesan. Idenya berasal dari HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Tangkapan layar: Langkah terencana"></a> |
72
72
  | **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> |
73
73
  | **Perintah yang diblokir** | <a id="feature-blockedcommands"></a>Aktif secara bawaan, dengan daftar kosong. Perintah shell agen (`bash`, `pwsh`) tidak dapat menjalankan perintah yang cocok dengan aturan Anda: aturan **blokir** menolak panggilan itu (agen membaca alasannya dan diminta untuk bertanya kepada Anda), aturan **tanya dulu** menampilkan kartu persetujuan dsh, dan perintah hanya berjalan jika Anda mengizinkannya. Pengaturan → Composer Plus → **Perintah yang diblokir**: ketik aturan (misalnya `npm publish`, `git push --force`, atau `ssh *192.168.2.19`), klik jenisnya untuk beralih antara **blokir** dan **tanya dulu**, lalu klik **Tambah**; klik jenis sebuah aturan untuk mengubahnya, hapus aturan dengan ✕. Aturan adalah nama perintah dan kata-kata yang harus muncul sesudahnya dalam urutan ini; `*` cocok dengan teks apa pun. Fitur ini juga menemukan perintah sesudah `&&`, `;`, `\|`, di dalam `$(…)`, `bash -c "…"`, atau `eval`, dan sesudah `sudo` atau `env`. Ini pagar pengaman, bukan sandbox: variabel (`$CMD`), file skrip, atau program lain tetap dapat menjalankan perintah itu (lihat Batasan). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Tangkapan layar: Perintah yang diblokir"></a> |
74
- | **Papan tugas** | <a id="feature-taskboard"></a>Bilah samping kiri → **Papan tugas**. Papan kanban obrolan dsh Anda dengan status langsung yang sama seperti di bilah samping: obrolan yang menunggu persetujuan, jawaban, atau tinjauan rencana Anda ada di **Ditinjau** dengan titik oranye, obrolan yang berjalan ada di **Sedang dikerjakan**, dan obrolan yang sudah selesai ada di **Selesai** (hijau sampai Anda membukanya). Pilih proyek atau **Semua proyek** di kiri; folder branch per obrolan dihitung sebagai proyeknya. Ketik di **Cari proyek** di atas daftar untuk menemukan proyek berdasarkan namanya (huruf besar/kecil dan aksen tidak berpengaruh; `Esc` mengosongkan kotak), dan klik **Aktif dalam 2 jam terakhir** untuk hanya menampilkan proyek dengan obrolan yang menunggu, berjalan, selesai tetapi belum dilihat, atau berubah dalam 2 jam terakhir (disimpan di perangkat ini). **Tugas baru** (atau `n`) membuka obrolan baru milik dsh sendiri di proyek yang ditampilkan papan (dengan **Semua proyek**, proyek yang dipilih Sesi Baru dsh), jadi Anda bisa menambahkan file, memakai perintah, dan memilih model seperti di obrolan mana pun. Saat pesan pertama Anda terkirim, papan kembali dengan sendirinya. Sampai saat itu, obrolan menunggu di **Akan dikerjakan** sebagai **Tugas baru**: klik obrolan itu untuk menulis pesan pertama. Kolom **Akan dikerjakan** hanya muncul saat itu. Proyek yang punya obrolan yang menunggu Anda memiliki titik oranye di daftar proyek. dsh memberi nama obrolan, dan model obrolan menulis hingga 3 label dari pesan itu. Klik kartu untuk membuka obrolannya. Di kartu oranye, klik **Jawab** untuk menjawabnya di papan: **Tolak** atau **Izinkan sekali**, **Setujui** atau **Minta perubahan** untuk rencana, atau pilihan dan teks Anda sendiri untuk pertanyaan. **Sembunyikan yang selesai** menyembunyikan **Selesai** di perangkat ini. Arahkan penunjuk ke kartu di **Sedang dikerjakan** (atau pindahkan fokus keyboard ke kartu itu) untuk melihat progresnya: berapa lama obrolan berjalan, langkah dari daftar tugasnya, alat yang sedang berjalan, dan baris terakhir agen. Di Pengaturan → Composer Plus → Papan tugas, **Progres saat kursor di atas** memilih **Cepat (tanpa AI)** (default: hanya membaca obrolan) atau **Ringkasan AI** (satu panggilan singkat ke model obrolan juga menulis satu atau dua kalimat). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Tangkapan layar: Papan tugas"></a> |
74
+ | **Papan tugas** | <a id="feature-taskboard"></a>Bilah samping kiri → **Papan tugas**, atau tekan `Cmd+Shift+K` (`Ctrl+Shift+K` di Windows dan Linux) di mana saja dalam dsh. Papan kanban obrolan dsh Anda dengan status langsung yang sama seperti di bilah samping: obrolan yang menunggu persetujuan, jawaban, atau tinjauan rencana Anda ada di **Ditinjau** dengan titik oranye, obrolan yang berjalan ada di **Sedang dikerjakan**, dan obrolan yang sudah selesai dan belum Anda buka ada di **Selesai** (hijau). Saat Anda membuka obrolan, kartunya keluar dari **Selesai** dengan sendirinya; klik **Baru selesai (N)** di bawah kartu hijau untuk melihat obrolan selesai yang sudah Anda baca (10 terbaru, lalu **Tampilkan N yang lebih lama**; terbuka atau tertutup disimpan di perangkat ini). Obrolan yang selesai saat terbuka di belakang papan (**Tugas baru**) tetap hijau sampai Anda membukanya. Klik nama proyek di bagian atas papan untuk membuka daftar proyek, lalu pilih proyek atau **Semua proyek**; folder branch per obrolan dihitung sebagai proyeknya. Daftar tertutup setelah Anda memilih, dengan `Esc`, atau dengan klik di luar daftar. Ketik di **Cari proyek** di bagian atas daftar untuk menemukan proyek berdasarkan namanya (huruf besar/kecil dan aksen tidak berpengaruh; `Esc` mengosongkan kotak), tekan `Enter` untuk memilih hasil pertama, dan klik **Aktif dalam 2 jam terakhir** untuk hanya menampilkan proyek dengan obrolan yang menunggu, berjalan, selesai tetapi belum dilihat, atau berubah dalam 2 jam terakhir (disimpan di perangkat ini). **Tugas baru** (atau `n`) membuka obrolan baru milik dsh sendiri di proyek yang ditampilkan papan (dengan **Semua proyek**, proyek yang dipilih Sesi Baru dsh), jadi Anda bisa menambahkan file, memakai perintah, dan memilih model seperti di obrolan mana pun. Saat pesan pertama Anda terkirim, papan kembali dengan sendirinya. Sampai saat itu, obrolan menunggu di bagian paling atas **Sedang dikerjakan** sebagai **Tugas baru**: klik obrolan itu untuk menulis pesan pertama. Proyek yang punya obrolan yang menunggu Anda memiliki titik oranye di daftar proyek (nama proyek di bagian atas juga memilikinya selama ada obrolan yang menunggu). dsh memberi nama obrolan, dan model obrolan menulis hingga 3 label dari pesan itu. Klik kartu untuk membuka obrolannya. Klik kartu oranye (atau **Jawab** di kartu itu) untuk menjawabnya di papan; panelnya punya **Buka obrolan** untuk seluruh obrolan: **Tolak** atau **Izinkan sekali**, **Setujui** atau **Minta perubahan** untuk rencana, atau pilihan dan teks Anda sendiri untuk pertanyaan. Klik **×** di kartu yang selesai untuk mengeluarkannya dari papan, atau buka **Baru selesai** lalu klik **Bersihkan semua** di bagian atas **Selesai** untuk mengeluarkan kartu-kartu itu dari papan: lebih dulu ditampilkan berapa kartu dari proyek mana yang keluar, dan kartu yang belum dibaca (hijau) tetap ada. Selama 8 detik setelahnya, **Urungkan** mengembalikan kartu-kartu itu; **Dikeluarkan (N)** di bawah **Selesai** menampilkan daftar kartu yang ada di luar papan, dan **Kembalikan** menampilkan satu kartu lagi di **Selesai**. Tidak ada obrolan yang dihapus: obrolan tetap ada di bilah samping dsh, papan mengingat hal ini setelah dimulai ulang (Tether menampilkan papan yang sama), dan obrolan yang berjalan lagi kembali ke papan. Arahkan penunjuk ke kartu di **Sedang dikerjakan** (atau pindahkan fokus keyboard ke kartu itu) untuk melihat progresnya: berapa lama obrolan berjalan, langkah dari daftar tugasnya, alat yang sedang berjalan, dan baris terakhir agen. Di Pengaturan → Composer Plus → Papan tugas, **Progres saat kursor di atas** memilih **Cepat (tanpa AI)** (default: hanya membaca obrolan) atau **Ringkasan AI** (satu panggilan singkat ke model obrolan juga menulis satu atau dua kalimat). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Tangkapan layar: Papan tugas"></a> |
75
75
  | **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> |
76
+ | **Riwayat versi memori** | <a id="feature-memoryhistory"></a>Aktif secara default selama **Memori proyek** aktif. Sebelum setiap penyimpanan memori (agen, tinjauan setelah giliran, **Buka memori**), salinan catatan seperti sebelumnya disimpan. Di **Buka memori**, pilih proyek atau **Memori global**, lalu **Riwayat**: versi menurut tanggal dan siapa yang mengubah memori setelah setiap versi. Pilih versi untuk melihat sebagai diff apa yang diubah pemulihan, lalu **Pulihkan**. Catatan sebelum pemulihan juga disimpan, jadi Anda bisa membatalkannya. 50 versi terbaru dari setiap memori tetap ada. Di Tether: menu judul chat → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Tangkapan layar: Riwayat versi memori"></a> |
77
+ | **Ekspor memori ke AGENTS.md** | <a id="feature-memoryexport"></a>Di **Buka memori**, pilih proyek, lalu **Ekspor ke AGENTS.md**: catatan proyek itu masuk ke bagian bertanda di `AGENTS.md` di foldernya, sehingga Anda bisa meng-commit-nya dan membagikannya dengan tim serta alat agen lain. Anda melihat perubahannya sebagai diff dulu; hanya **Tulis AGENTS.md** yang menyimpannya. Ekspor berikutnya hanya mengganti bagian itu. Memori global, sumber, dan tanggal tidak ikut. Di Tether: menu judul chat → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Tangkapan layar: Ekspor memori ke AGENTS.md"></a> |
78
+ | **Tautan sumber catatan memori** | <a id="feature-memorysource"></a>Di **Buka memori**, catatan yang berasal dari chat (disimpan agen, dipertahankan tinjauan setelah giliran, atau saran yang Anda terima) punya **Sumber** di sampingnya: satu klik membuka chat itu pada pesannya, sehingga Anda bisa memeriksa mengapa catatan itu ada sebelum mengubah atau menghapusnya. Catatan dari versi sebelumnya hanya membuka chatnya. Di Tether: menu judul chat → Project memory → Source. | <a href="assets/features/memorySource.webp"><img src="assets/features/memorySource.webp" width="160" alt="Tangkapan layar: Tautan sumber catatan memori"></a> |
79
+ | **Salin memori ke proyek lain** | <a id="feature-memorycopy"></a>Di **Buka memori**, pilih proyek atau **Memori global**, lalu **Salin ke proyek**: centang catatan, cari proyek dsh, lalu klik salah satunya. Semua catatan yang dicentang masuk ke memori proyek itu (dengan topik dan sumbernya), atau tidak satu pun: jika satu tidak muat, tidak ada yang disalin dan alasannya ditampilkan. Catatan yang sudah ada di proyek dilewati. Di Tether: menu judul chat → Project memory → Copy to project. | <a href="assets/features/memoryCopy.webp"><img src="assets/features/memoryCopy.webp" width="160" alt="Tangkapan layar: Salin memori ke proyek lain"></a> |
80
+ | **Temukan catatan memori yang usang** | <a id="feature-memorystale"></a>Saat Anda memilih proyek di **Buka memori**, path file (dalam `kode`), skrip npm, dan nama branch yang disebut catatannya dicocokkan dengan proyek saat ini. Catatan yang menyebut sesuatu yang sudah tidak ada di proyek menampilkan ⚠ beserta yang hilang, sehingga Anda bisa memperbaiki atau menghapusnya sebelum model memakainya. Hanya membaca file biasa di dalam folder proyek dan satu daftar branch git; tidak mengubah apa pun dan tidak memanggil model. Di Tether: menu judul chat → Project memory. | <a href="assets/features/memoryStale.webp"><img src="assets/features/memoryStale.webp" width="160" alt="Tangkapan layar: Temukan catatan memori yang usang"></a> |
81
+ | **Jangan gunakan memori di chat ini** | <a id="feature-memoryperchat"></a>Selama **Memori proyek** aktif, kepala chat menampilkan **Memori aktif**: klik untuk mematikan memori hanya di chat itu (**Memori nonaktif**). Model chat itu lalu tidak mendapat bagian memori dan alat memori, dan tinjauan setelah setiap giliran tidak membacanya. Di dsh 0.2.1 dan yang lebih baru, tombol yang sama ada di layar chat baru, sehingga chat uji coba dimulai tanpa memori. Chat lain tidak berubah. Di Tether: menu judul chat → Use project memory. | <a href="assets/features/memoryPerChat.webp"><img src="assets/features/memoryPerChat.webp" width="160" alt="Tangkapan layar: Jangan gunakan memori di chat ini"></a> |
82
+ | **Sarankan catatan memori dari chat** | <a id="feature-memorysuggest"></a>Selama **Memori proyek** aktif, kepala chat punya **Sarankan untuk memori**: satu klik menanyakan kepada model chat aturan dan keputusan apa dari chat ini yang layak disimpan untuk chat berikutnya. Setiap saran menunjukkan alasannya; **Terima** menyimpannya dengan tautan ke chat dan pesan asalnya, **Tolak** membuangnya. Tidak ada yang disimpan sebelum Anda menerima, dan model hanya dipanggil saat Anda mengklik. Pesan yang ditarik oleh rollback tidak dikirim. Di Tether: menu judul chat → Suggest for memory. | <a href="assets/features/memorySuggest.webp"><img src="assets/features/memorySuggest.webp" width="160" alt="Tangkapan layar: Sarankan catatan memori dari chat"></a> |
76
83
  | **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> |
84
+ | **Tolak dengan catatan** | <a id="feature-rejectnote"></a>Kartu persetujuan menampilkan **Tolak dengan catatan…** di samping **Tolak**. Klik, tulis alasannya atau apa yang harus dilakukan sebagai gantinya, lalu klik **Tolak** (atau tekan `Enter`; `Shift+Enter` menambah baris, `Esc` menutup kolom). Catatan dikirim ke agen lebih dulu, sebagai pesan ke giliran yang menunggu, lalu permintaan ditolak: model membaca penolakan dan catatan Anda di giliran yang sama, tanpa pesan tambahan dari Anda. Jika catatan tidak dapat dikirim, tidak ada yang ditolak dan kolom tetap terbuka. Di Tether: lembar persetujuan → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Tangkapan layar: Tolak dengan catatan"></a> |
85
+ | **Input rahasia** | <a id="feature-secretinput"></a>Agen mendapat alat `request_secret`. Saat memerlukan kata sandi, token, atau kunci API, agen memintanya dengan alat ini, bukan di obrolan: sebuah kartu muncul di baris alat dengan nama, alasan, kolom kata sandi, **Simpan**, dan **Tolak**. **Simpan** menulis nilai ke file di Mac ini yang hanya dapat Anda baca, dan agen hanya menerima path file itu, yang dipakai sebagai input perintah (misalnya `"$(cat <path>)"`). Jika hasil alat berikutnya menampilkan nilai itu, `[secret]` menggantikannya sebelum model melihatnya. File dihapus saat giliran berakhir. **Tolak** memberi tahu agen bahwa Anda tidak memberikannya. Nonaktifkan di **Pengaturan → Composer Plus** untuk menghapus alat itu. Di Tether: bilah "Secret: …" di atas kolom ketik → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Tangkapan layar: Input rahasia"></a> |
86
+ | **Kutip dalam balasan** | <a id="feature-quotereply"></a>Pilih sebagian jawaban: tombol **Kutip** muncul di atas pilihan. Klik tombol itu: bagian tersebut masuk ke kolom ketik di posisi kursor sebagai kutipan Markdown (`> …`), dengan satu baris kosong setelahnya, dan kolom ketik mendapat fokus sehingga Anda menulis balasan di bawahnya. Hanya teks jawaban yang dihitung, bukan proses berpikir, baris alat, atau pesan Anda sendiri. Satu kutipan paling banyak 2.000 karakter. `Cmd+Z` (`Ctrl+Z`) menghapusnya. Di Tether: tekan lama sebuah jawaban → Quote (seluruh jawaban). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Tangkapan layar: Kutip dalam balasan"></a> |
87
+ | **Obrolan samping** | <a id="feature-sidechat"></a>Ketik pertanyaan samping di kolom ketik dan klik tombol gelembung percakapan (**Tanya di obrolan samping**): salinan obrolan terbuka dan menjawabnya dalam mode hanya baca dsh, sementara obrolan terus bekerja. Salinan mengetahui obrolan sampai saat ini, kecuali pesan yang masih menunggu di antrean, dan memakai modelnya. Bilah di atas kolom ketiknya memiliki **Bawa kembali**: obrolan terbuka dan kolom ketiknya menerima pertanyaan Anda (sebagai kutipan `> `) dan jawabannya. **Kembali ke obrolan** hanya membuka obrolan. Obrolan samping tetap di bilah samping sebagai "↳ <pertanyaan>"; arsipkan di sana. Di Tether: menu judul obrolan → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Tangkapan layar: Obrolan samping"></a> |
88
+ | **Catatan diff** | <a id="feature-diffcomments"></a>Di **Panel perubahan**, buka diff sebuah file dan klik **+** pada sebuah baris (Shift+klik baris kedua di blok yang sama untuk rentang), tulis catatan, lalu klik **Simpan catatan**. Catatan obrolan menunggu di bilah di atas panel; **Kirim ke kolom ketik** menaruhnya di posisi kursor sebagai Markdown: `path:12-14`, baris sebagai blok `diff`, dan catatan Anda. **Hapus** membuangnya. Catatan tetap di browser ini sampai Anda mengirim atau menghapusnya. Memerlukan **Panel perubahan**. Di Tether: diff sebuah file → tekan lama sebuah baris → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Tangkapan layar: Catatan diff"></a> |
77
89
  | **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> |
78
90
  | **Branch Git di baris obrolan** | <a id="feature-sessionbranch"></a>Dalam tampilan “Dalam satu daftar” di bilah samping, setiap baris obrolan 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. Dalam “Ruang Kerja” dan “Pohon Ruang Kerja”, tidak ada baris obrolan yang menampilkan label, karena obrolan sudah berada di bawah baris proyeknya. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Tangkapan layar: Branch Git di baris obrolan"></a> |
79
91
  | **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> |
@@ -83,8 +95,11 @@ Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil
83
95
  | **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> |
84
96
  | **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> |
85
97
  | **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> |
98
+ | **Obrolan menunggu berikutnya** | <a id="feature-nextwaiting"></a>Tombol di kepala bilah samping menunjukkan berapa banyak obrolan lain yang menunggu Anda, dengan titik berwarna sama seperti obrolan berikutnya: oranye saat obrolan itu mengajukan pertanyaan atau menunggu persetujuan atau tinjauan rencana, hijau saat obrolan itu menyelesaikan giliran yang belum Anda baca. Klik tombol itu, atau tekan Cmd+Shift+E (Ctrl+Shift+E di Windows dan Linux), untuk membuka obrolan tersebut. Obrolan oranye didahulukan dari obrolan hijau; di setiap kelompok, obrolan yang paling lama menunggu didahulukan. Obrolan yang sedang tampil tidak dihitung. Jika tidak ada obrolan lain yang menunggu, tombol tidak tampil dan tombol pintas tidak melakukan apa pun. Anda dapat mengubah tombolnya di halaman pintasan keyboard dsh (Obrolan menunggu berikutnya). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Tangkapan layar: Obrolan menunggu berikutnya"></a> |
99
+ | **Tombol opsi** | <a id="feature-optionpicks"></a>Saat jawaban diakhiri daftar opsi (daftar bernomor 1 sampai 9 butir di bawah judul "Opsi" atau baris tebal "Opsi", juga "Langkah selanjutnya" dan kata yang sama dalam bahasa aplikasi), tombol untuk setiap opsi muncul di bawah jawaban. Klik mengirim "Option N: …" beserta seluruh opsi sebagai pesan Anda, seolah-olah Anda mengetiknya. Opsi yang bertanda "(disarankan)" ditandai. Tombol hanya muncul di bawah jawaban terbaru, saat obrolan sedang diam dan kotak pesan kosong; jawaban yang sudah dipilih dan jawaban yang ditarik oleh rollback tidak memiliki tombol. Selama tombol tampil, Prediksi pesan berikutnya tidak memberi tebakan. Pada kartu pertanyaan agen, tombol 1–9 memilih opsi itu seperti klik (tidak di kolom jawaban, dan tidak dalam 0,8 detik pertama setelah pertanyaan muncul). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Tangkapan layar: Tombol opsi"></a> |
86
100
  | **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> |
87
101
  | **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> |
102
+ | **Komputer jarak jauh** | <a id="feature-remotecomputers"></a>Buka dsh di Mac Anda yang lain melalui [Tailscale](https://tailscale.com) dan lanjutkan obrolannya di sini. Aktifkan di **Pengaturan → Composer Plus** pada setiap Mac (nonaktif secara default karena membuka port jaringan). Di Mac yang ingin Anda buka, aktifkan **Izinkan komputer lain membuka Mac ini**, klik **Buat tautan pemasangan**, lalu salin tautannya. Di Mac ini, pilih **Tambahkan komputer…** di pemilih komputer di sebelah kiri judul obrolan, tempel tautannya, lalu klik **Hubungkan**. Setelah itu, klik **Setujui** di Mac yang lain. Pemilih lalu menampilkan **Mac ini** dan komputer Anda: pilih salah satu, dan dsh-nya terbuka di tab Browser pada bilah samping kanan (atau di jendela browser), dengan obrolan, alat, dan file miliknya sendiri. Panel Pengaturan dapat mengganti nama dan menghapus komputer, serta menampilkan komputer yang dapat membuka Mac ini (**Hapus** langsung memutus salah satunya). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Tangkapan layar: Komputer jarak jauh"></a> |
88
103
  | **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 dalam bahasa **Bahasa aplikasi** (catatan ikut bersama versi baru, tanpa panggilan jaringan lain; bahasa tanpa catatan menampilkan catatan berbahasa Inggris); **Tutup** atau `Esc` menutupnya. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Tangkapan layar: Pembaruan otomatis"></a> |
89
104
  | **Pencadangan** | <a id="feature-backup"></a>Pengaturan → Composer Plus → **Pencadangan** → **Cadangkan sekarang** menulis seluruh dsh home Anda (obrolan, pengaturan, plugin, MCP, skill) ke dalam satu arsip di `~/Desktop/dsh-backups`, beserta checksum. Rahasia disamarkan di dalam arsip: file kredensial, file kunci (`.pem`, `.key`), serta nilai token, secret, dan password di pengaturan yml hanya tetap ada di komputer ini, di `vault` folder tersebut. `cache/`, `dsh-runtimes/`, dan `node_modules` tidak masuk ke arsip (dsh membuatnya lagi). Setiap cadangan dalam daftar memiliki **Periksa** (membacanya sampai habis), **Untuk komputer lain** (folder untuk disalin ke komputer baru, beserta konsol penyelamat), dan **Hapus**. Arsip dsh-backup di folder yang sama juga tampil dan dapat dipakai. Untuk memulihkan, keluar dari dsh dan gunakan konsol penyelamat. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Tangkapan layar: Pencadangan"></a> |
90
105
  | **Pencadangan otomatis** | <a id="feature-autobackup"></a>Aktifkan **Pencadangan otomatis** (nonaktif secara default: setiap salinan kira-kira sebesar dsh home Anda tanpa cache-nya). Pilih seberapa sering (**Setiap**: 6 jam sampai 7 hari, default 24 jam) dan berapa banyak cadangan yang disimpan (**Simpan**: 3 sampai 14, default 7). Waktu berikutnya tampil di bawah sakelar; pencadangan yang gagal juga tampil di sana dan dicoba lagi 30 menit kemudian. Saat dsh atau Composer Plus dimulai dengan versi baru, snapshot dibuat segera setelah dimulai, sebelum versi baru lama memakai data Anda (dua yang terbaru disimpan, ditandai **Sebelum peningkatan**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Tangkapan layar: Pencadangan otomatis"></a> |
@@ -137,6 +152,9 @@ Setiap paket berisi 3.280 teks: setiap teks UI dsh `0.2.0-rc.2` dan `0.2.1-rc.2`
137
152
  | `Cmd+F` di Mac, `Ctrl+F` di Windows dan Linux | obrolan yang terbuka | buka **Cari di obrolan** |
138
153
  | `Enter` / `Shift+Enter`, `↓` / `↑` | kotak **Cari di obrolan** | kecocokan berikutnya / sebelumnya |
139
154
  | `Esc` | kotak **Cari di obrolan** | tutup kotak |
155
+ | `Cmd+Shift+E` di Mac, `Ctrl+Shift+E` di Windows dan Linux | di mana saja dalam dsh | buka **Obrolan menunggu berikutnya** (ubah di halaman pintasan keyboard dsh) |
156
+ | `Cmd+Shift+K` di Mac, `Ctrl+Shift+K` di Windows dan Linux | di mana saja dalam dsh | buka **Papan tugas** (ubah di halaman pintasan keyboard dsh) |
157
+ | `1`–`9` | kartu pertanyaan dsh, tidak di kolom jawabannya | pilih opsi itu (**Tombol opsi**) |
140
158
 
141
159
  Menu `/` atau `@` yang terbuka memakai tombol-tombol ini untuk dirinya sendiri.
142
160
 
@@ -162,17 +180,20 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
162
180
  - **Izinkan untuk obrolan ini:** izin disimpan beserta waktu pemberiannya di `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (izin akses hanya untuk pemilik). Satu izin berlaku untuk satu alat tertentu di satu obrolan, sampai batas waktu berakhir (1 jam secara default). Jika alat itu dapat menulis, izin itu juga mencakup penulisan apa pun. Cabut izin dari chip di header.
163
181
  - Tinjauan otomatis tetap berjalan pada setiap panggilan; tinjauan yang gagal tidak pernah diizinkan secara otomatis.
164
182
  - **Koneksi seluler:** nonaktif sampai Anda mengaktifkannya. Selama aktif, bagian Host menjalankan gateway Tether: HTTPS di port 19390 yang hanya menerima subnet Wi-Fi dan tailnet Anda (100.64.0.0/10), serta halaman pemasangan di `127.0.0.1:19391` (hanya Mac ini). Ponsel memerlukan kode sekali pakai dari kode QR (berlaku 5 menit) dan klik **Approve** dari Anda di Mac. Ponsel menyematkan (pin) sertifikat gateway. Mac hanya menyimpan hash token setiap ponsel (30 hari, diperpanjang selama dipakai); **Remove** langsung menutup koneksi ponsel itu. Ponsel hanya dapat memanggil daftar metode dsh yang diizinkan (obrolan, prompt, lampiran, perintah garis miring, persetujuan, pertanyaan, model, agen, tujuan), bukan pengaturan, kredensial, browser file, atau terminal. "Tailscale only" menolak setiap koneksi dari jaringan lokal, termasuk koneksi yang sudah terbuka. Log akses menyimpan 200 percobaan koneksi terbaru (waktu, alamat IP, nama perangkat, diizinkan atau ditolak, dan alasannya) di `access.json`; log ini tidak pernah menyimpan token atau kode pemasangan. Data: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (file hanya untuk pemilik). Detail: [tether/README.md](tether/README.md).
183
+ - **Komputer jarak jauh:** nonaktif sampai Anda mengaktifkannya di setiap Mac. **Izinkan komputer lain membuka Mac ini** membuka port HTTPS kedua (19392) hanya di alamat Tailscale Mac ini (tidak di Wi-Fi, dan tidak diumumkan dengan Bonjour). Mac lain memerlukan tautan pemasangan sekali pakai (berlaku 5 menit), sertifikat yang cocok (disematkan), dan klik **Setujui** dari Anda. Mac ini hanya menyimpan hash token Mac itu. Komputer yang dipasangkan mendapat kendali penuh atas dsh di Mac ini, seolah-olah Anda memakainya di sini: obrolan, model, alat, file, dan terminalnya. Hapus komputer itu di panel Pengaturan, dan koneksinya langsung ditutup. Mac yang membuka Mac lain menyimpan token komputer itu di `$DSH_HOME/storages/dsh-composer-plus/computers.json` (hanya untuk pemilik). Mac itu membuka relay di `127.0.0.1` untuk setiap komputer yang Anda pilih. Halaman mendapat tautan sekali pakai (berlaku 60 detik), dan relay hanya menerima halamannya sendiri (alamatnya sendiri, tidak ada situs lain). Halaman yang dibuka oleh Mac lain tidak menampilkan pemilih komputer dan tidak dapat mengubah komputer Mac ini.
165
184
  - **Pembaruan:** bagian Host menanyakan rilis terbaru ke `api.github.com` dan versi persis itu ke `registry.npmjs.org`; tidak ada data tentang Anda atau obrolan Anda yang dikirim. Pemasangan memakai pengelola plugin dsh (`pnpm add dsh-composer-plus@<version>`; jika dsh 0.2.1 menolaknya untuk plugin yang sudah terpasang, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, lalu profil mencantumkan URL itu sebagai sumber plugin), jadi pemeriksaan registri, skrip, dan kompatibilitas versi milik dsh tetap berlaku. Tag pra-rilis dan versi lama tidak pernah dipasang.
185
+ - **Penghitungan penggunaan:** sekali sehari, bagian Host meminta file kecil `active.txt` dari rilis versi yang terpasang ke GitHub (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/active.txt`). GitHub menghitung permintaan ini per file, sehingga pembuat hanya melihat berapa salinan dari tiap versi yang meminta pada hari itu. Permintaan tidak berisi id, cookie, atau data tentang Anda atau obrolan Anda; GitHub melihat alamat IP Anda, sama seperti pada setiap pemeriksaan pembaruan. Hari permintaan terakhir disimpan di `$DSH_HOME/storages/dsh-composer-plus/active.json`. Salinan git dari repositori ini dan salinan yang namanya diubah tidak mengirim apa pun. Tidak ada sakelar untuk ini.
166
186
  - **Prediksi pesan berikutnya:** aktif secara default. Nonaktifkan di **Pengaturan → Composer Plus** untuk menghentikan panggilan model ini. Setelah setiap giliran selesai, bagian Host mengirim pesan Anda sendiri di obrolan itu dan balasan teks agen (tanpa keluaran alat, tanpa konteks tersembunyi, tanpa penalaran), paling banyak sekitar 6.000 karakter (bagian terbaru), ke model yang dipilih (model default dsh, kecuali Anda memilih yang lain). Pengiriman ini memakai pengaturan penyedia bawaan dsh, sebagai satu permintaan. Tidak ada yang disimpan di obrolan: tebakan tidak ditambahkan ke riwayat obrolan. Sakelar dan pilihan model disimpan di `$DSH_HOME/storages/dsh-composer-plus/predict.json` (file hanya untuk pemilik).
167
187
  - **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).
168
188
  - **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).
169
189
  - **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).
170
190
  - **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.
171
191
  - **Rincian konteks:** bagian Host hanya membaca log obrolan; tanpa panggilan model, tanpa file proyek.
172
- - **Papan tugas:** papan menampilkan obrolan dsh sendiri dari daftar dsh sendiri di jendela ini; papan tidak menambahkan data obrolan miliknya sendiri. **Tugas baru** membuka obrolan baru milik dsh sendiri, dan Anda menulis pesan pertama di kotak pesan dsh, jadi persetujuan, sandbox, dan model obrolan berlaku seperti biasa. Bagian Host menyimpan pesan pertama obrolan itu sebagai prompt kartu dan mengirimnya (4.000 karakter pertamanya, tidak ada yang lain) ke model obrolan tersebut dalam satu permintaan lagi, tanpa alat, untuk mendapatkan hingga 3 label. Prompt, label, dan waktu mulai setiap tugas disimpan di `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (file hanya untuk pemilik, 2.000 yang terbaru); sakelarnya ada di `board-switch.json` di sebelahnya. Tidak ada yang ditulis ke folder proyek. **Jawab** mengirim jawaban Anda ke permintaan dsh sendiri yang tertunda, sama seperti kartu milik obrolan itu sendiri. Daftar tugas lama dari versi sebelumnya (`board.json`) tetap ada di disk seperti semula dan tidak dibaca. **Progres saat kursor di atas** membaca log obrolan di Mac ini. Dengan **Cepat (tanpa AI)** (default), tidak ada yang dikirim. Dengan **Ringkasan AI**, selama kotak progres kartu yang sedang berjalan tampil (atau selama papan Tether terbuka, untuk paling banyak 8 kartu yang berjalan), bagian Host mengirim bagian terbaru obrolan itu (paling banyak sekitar 6.000 karakter: pesan Anda, balasan teks agen, panggilan alatnya dan akhir hasilnya; tanpa penalaran dan tanpa pesan yang ditarik oleh putar balik) ke model obrolan itu, sebagai satu permintaan tanpa alat. Bagian Host mengirim lagi hanya setelah obrolan berlanjut, paling sering sekali setiap 20 detik per obrolan. Catatan itu hanya disimpan di memori; pengaturannya ada di `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (file hanya untuk pemilik).
192
+ - **Papan tugas:** papan menampilkan obrolan dsh sendiri dari daftar dsh sendiri di jendela ini; papan tidak menambahkan data obrolan miliknya sendiri. **Tugas baru** membuka obrolan baru milik dsh sendiri, dan Anda menulis pesan pertama di kotak pesan dsh, jadi persetujuan, sandbox, dan model obrolan berlaku seperti biasa. Bagian Host menyimpan pesan pertama obrolan itu sebagai prompt kartu dan mengirimnya (4.000 karakter pertamanya, tidak ada yang lain) ke model obrolan tersebut dalam satu permintaan lagi, tanpa alat, untuk mendapatkan hingga 3 label. Prompt, label, dan waktu mulai setiap tugas disimpan di `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (file hanya untuk pemilik, 2.000 yang terbaru), bersama ID obrolan yang Anda keluarkan dari papan dengan **×** atau **Bersihkan semua** (5.000 yang terbaru); sakelarnya ada di `board-switch.json` di sebelahnya. Tidak ada yang ditulis ke folder proyek. **Jawab** mengirim jawaban Anda ke permintaan dsh sendiri yang tertunda, sama seperti kartu milik obrolan itu sendiri. Daftar tugas lama dari versi sebelumnya (`board.json`) tetap ada di disk seperti semula dan tidak dibaca. **Progres saat kursor di atas** membaca log obrolan di Mac ini. Dengan **Cepat (tanpa AI)** (default), tidak ada yang dikirim. Dengan **Ringkasan AI**, selama kotak progres kartu yang sedang berjalan tampil (atau selama papan Tether terbuka, untuk paling banyak 8 kartu yang berjalan), bagian Host mengirim bagian terbaru obrolan itu (paling banyak sekitar 6.000 karakter: pesan Anda, balasan teks agen, panggilan alatnya dan akhir hasilnya; tanpa penalaran dan tanpa pesan yang ditarik oleh putar balik) ke model obrolan itu, sebagai satu permintaan tanpa alat. Bagian Host mengirim lagi hanya setelah obrolan berlanjut, paling sering sekali setiap 20 detik per obrolan. Catatan itu hanya disimpan di memori; pengaturannya ada di `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (file hanya untuk pemilik).
173
193
  - **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.
174
194
  - **Perintah yang diblokir:** aturan dan sakelarnya ada di `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (file hanya untuk pemilik). Pemeriksaan hanya membaca teks perintah dari setiap panggilan `bash` dan `pwsh`; pemeriksaan tidak menjalankan apa pun dan tidak mengirim apa pun.
175
- - **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.
195
+ - **Input rahasia:** nilai dikirim dari kartu (atau dari Tether, lewat gateway yang tidak mencatat isi permintaan) ke Host hanya dalam permintaan jawaban. Host menulisnya ke `$DSH_HOME/storages/dsh-composer-plus/secrets/<nama acak>` (folder 0700, file 0600); tidak ada yang masuk ke proyek, log obrolan, atau hasil alat. Host menyimpan nilai di memori untuk menggantinya dengan `[secret]` di hasil alat berikutnya dalam obrolan itu. File dan salinan itu dihapus saat giliran obrolan berakhir dan saat dsh dimulai. Sakelarnya ada di `secrets.json` di sebelahnya. Perintah yang dijalankan agen dengan file itu dapat mengirim nilai ke tempat yang dituju perintah itu: itulah tujuannya.
196
+ - **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. **Riwayat versi memori** (aktif secara default) menyimpan salinan file memori sebelum setiap penyimpanan di `memory/history/` di sebelahnya (file khusus pemilik, 50 terbaru per memori); tidak mengirim apa pun ke model. **Ekspor memori ke AGENTS.md** tidak mengirim apa pun ke model dan hanya menulis saat Anda mengklik **Tulis AGENTS.md**: fitur ini membaca dan menulis `AGENTS.md` di folder proyek memori itu (hanya file biasa di dalamnya, tidak pernah melalui tautan simbolis yang keluar dari folder), dan hanya mengubah bagian bertandanya. **Temukan catatan memori yang usang** tidak mengirim apa pun ke model dan tidak menulis apa pun: memeriksa path di dalam folder proyek dengan realpath (tidak ada file yang dibaca), membaca `package.json` hanya sebagai file biasa di dalam folder, dan menjalankan satu `git for-each-ref` di sana. **Jangan gunakan memori di chat ini** menyimpan setiap chat yang Anda matikan di `memory-chats.json` di sebelahnya (khusus pemilik, 500 terbaru); chat seperti itu tidak mengirim memori apa pun ke modelnya. **Sarankan catatan memori dari chat** tidak mengirim apa pun sampai Anda mengklik **Sarankan untuk memori**; lalu mengirim catatan tersimpan dari proyek chat dan catatan global, serta pesan dan balasan teks chat itu sendiri (tanpa keluaran alat atau pesan yang di-rollback; salinan induk dalam fork tidak disertakan; paling banyak sekitar 24.000 karakter), ke model chat itu sendiri sebagai satu permintaan tanpa alat. Saran hanya disimpan dengan **Terima**.
176
197
  - **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).
177
198
  - **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.
178
199
 
@@ -194,7 +215,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
194
215
  - **Tidak ada label branch di baris obrolan:** bilah samping tidak dalam tampilan “Dalam satu daftar” (dalam “Ruang Kerja” dan “Pohon Ruang Kerja”, tidak ada baris obrolan yang menampilkan label), 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).
195
216
  - **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.
196
217
  - **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).
197
- - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.20.0`), lihat catatan pemasangan di atas.
218
+ - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.21.0`), lihat catatan pemasangan di atas.
198
219
  - **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.
199
220
  - **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.
200
221
  - **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.
@@ -215,11 +236,17 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
215
236
  - Antrean dsh tidak memiliki tindakan `move`, jadi bagian Host plugin memindahkan pesan antrean itu sendiri di dalam antrean dsh (satu perubahan, pesan yang sama). Pesan dengan gambar atau file juga dapat dipindahkan. Hanya pesan Anda sendiri yang dapat dipindahkan: putaran tujuan atau balasan pertanyaan di antrean tetap di tempatnya. Jika sebuah pesan mulai dikirim saat Anda menyeret, tidak ada yang dipindahkan dan muncul pemberitahuan tentang hal itu.
216
237
  - dsh 0.2.1 langsung memuat pembaruan jika versi baru tidak mengubah pengaturan dsh apa pun; dalam kasus lain, dan pada dsh 0.2.0, mulai ulang dsh untuk memuatnya. Plugin tidak pernah memulai ulang dsh untuk Anda. Profil web/CLI tanpa pengelola plugin dsh hanya melaporkan adanya versi baru.
217
238
  - **Yang baru di Composer Plus N** menampilkan catatan dalam bahasa **Bahasa aplikasi**. Bahasa antarmuka dengan wilayah lain mendapat catatan bahasa dasarnya (`en-GB` mendapat catatan bahasa Inggris, `zh-TW` catatan bahasa Tionghoa dari `zh`). Bahasa tanpa catatan (bahasa yang ditambahkan paket bahasa lain, atau `pt-PT`, yang bukan `pt-BR`) menampilkan catatan bahasa Inggris. Catatan ikut bersama versi baru. Jika salinan yang berjalan tidak memiliki berkas catatan yang dapat dibaca (`release-notes.json`), jendela menampilkan catatan bahasa Inggris dari GitHub.
239
+ - **Tolak dengan catatan** mengirim catatan sebagai pesan ke giliran yang menunggu, lalu menolak permintaan; dsh menampilkan catatan itu di obrolan sebagai pesan Anda. Selama kolom catatan terbuka, kartu hanya menampilkan **Batal** dan **Tolak**, jadi satu klik tidak dapat mengizinkan permintaan secara tidak sengaja; `Esc` atau **Batal** mengembalikan tombol-tombol dsh. Catatan kosong tidak mengirim apa pun (gunakan **Tolak** milik dsh sendiri). Jika penolakan gagal setelah catatan terkirim (misalnya, permintaan itu sementara itu sudah dijawab di tempat lain), catatan tetap ada di obrolan dan model membacanya di langkah berikutnya. Tombol ini masuk ke markup kartu persetujuan dsh (`data-approval-key`), karena dsh tidak punya slot untuk tindakan kartu; jika pembaruan dsh mengubah markup itu, tombol tidak tampil dan **Tolak** milik dsh sendiri tetap berfungsi seperti sebelumnya. Satu catatan paling banyak berisi 4.000 karakter.
240
+ - **Input rahasia** hanya menyembunyikan teks persis dari sebuah nilai: `[secret]` menggantikannya di hasil alat berikutnya dalam obrolan yang sama. Agen tetap dapat membaca file dengan perintah shell dan mencetak nilai dalam bentuk lain (base64, sebagian, dengan spasi), dan bentuk itu sampai ke model. Alat file milik agen (read, grep, write, edit) tidak dapat membuka folder rahasia. Jika nilai itu juga kata yang umum, hasil lain dalam obrolan itu juga menampilkan `[secret]`. File tetap ada sampai giliran berakhir; jika dsh tertutup selama giliran, start berikutnya menghapusnya. Satu obrolan hanya dapat punya satu permintaan terbuka pada satu waktu. Alat ini menambahkan sekitar 870 karakter (sekitar 220 token, perkiraan) ke setiap permintaan model: nonaktifkan jika tidak dipakai.
241
+ - **Kutip dalam balasan** mengutip teks seperti yang ditampilkan halaman: blok kode, tabel, atau daftar menjadi baris biasa tanpa tanda Markdown. Pilihan yang mulai di satu jawaban dan berakhir di jawaban lain, atau yang menyentuh proses berpikir, baris alat, atau pesan Anda sendiri, tidak menampilkan tombol: pilih di dalam satu jawaban saja. Tombol menemukan jawaban lewat struktur obrolan dsh, karena dsh tidak punya slot untuk pilihan teks; jika pembaruan dsh mengubah struktur itu, tombol tidak muncul. Jika kutipan berada di akhir kolom, satu baris kosong lagi ditambahkan agar baris berikutnya yang Anda ketik mulai di bawahnya; dsh menghapus baris kosong di akhir saat mengirim.
242
+ - **Obrolan samping** hanya baca berkat mode hanya baca milik dsh sendiri: alat file tidak dapat menulis, dan perintah shell berjalan di sandbox dsh tanpa izin tulis (atau tidak berjalan saat sandbox tidak dapat dimulai). Agen tetap dapat meminta akses lebih dengan kartu persetujuan dsh, dan panggilan jaringan (misalnya permintaan API) tetap dapat mengubah sesuatu di luar komputer. Salinan dibuat pada saat terbaru ketika tidak ada pesan yang menunggu di antrean, jadi pertanyaan yang diajukan saat pesan masih menunggu tidak melihat apa yang terjadi setelahnya. Langkah obrolan yang sedang berjalan ditutup di salinan, jadi obrolan samping tahu awal langkah itu, tetapi tidak tahu hasilnya. Obrolan samping adalah obrolan biasa: tetap di bilah samping dan dihitung dalam pemakaian model Anda; arsipkan di sana. Bawa kembali hanya mengambil pesan milik obrolan samping (paling banyak 12.000 karakter) dan hanya balasan terakhir dari setiap pertanyaan; catatan agen di antara panggilan alatnya tidak ikut. dsh tidak menyediakan slot bagi plugin untuk menampilkan obrolan di bilah samping kanan, jadi obrolan samping terbuka di tampilan utama.
243
+ - **Catatan diff** hanya bekerja di panel perubahan, tidak di tampilan Giliran terakhir milik dsh. Rentang harus tetap dalam satu blok diff (satu bagian `@@`). Catatan disimpan di penyimpanan browser ini, jadi browser lain atau dsh di komputer lain tidak melihatnya; Tether menyimpan catatannya sendiri di memori. Catatan menyimpan baris seperti saat Anda mengklik: jika agen mengubah file kemudian, catatan tetap menampilkan baris dan nomor lama. Paling banyak 50 catatan per obrolan, 2.000 karakter per catatan, dan 40 baris per catatan (lalu baris `…`).
218
244
  - **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.
219
245
  - **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.
220
246
  - **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.
221
247
  - **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.
222
- - **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.
248
+ - **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. Tether menyimpan opsi ini dan jam-jamnya secara terpisah untuk setiap Mac yang dipasangkan. Opsi ini nonaktif secara default di setiap Mac, 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.
249
+ - **Komputer jarak jauh** memerlukan Tailscale di kedua Mac, dan Composer Plus dengan fitur ini aktif di Mac yang Anda buka. Mac itu tidak boleh dalam mode tidur, dan dsh harus berjalan di sana. Komputer lain terbuka di tab Browser pada bilah samping kanan obrolan yang ada di layar. Tab itu milik obrolan tersebut, jadi obrolan lain menampilkan bilah sampingnya sendiri. Tanpa obrolan (atau di dsh web tanpa tab Browser), komputer terbuka di jendela browser. Pemilih hanya tampil saat obrolan atau layar obrolan baru ada di area utama, tidak di Papan tugas. Fitur ini memakai port 19392 (hanya satu dsh di setiap Mac yang dapat mengizinkan komputer lain masuk). Komputer yang Anda buka di dalam halaman komputer lain tidak memiliki pemilih, jadi Anda tidak dapat membuka Mac ketiga dari sana.
223
250
  - 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.
224
251
  - **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.
225
252
  - **Edit pesan antrean di tempat** tidak mengubah pesan yang sementara itu mulai terkirim, dan tidak menimpa pesan yang sementara itu berubah (misalnya di Tether pada iPhone): sebuah pemberitahuan menyampaikannya. Gambar baru memerlukan model yang menerima gambar (batas gambar bawaan dsh berlaku), dan file baru harus selesai diunggah sebelum Anda dapat menyimpan. Hanya pesan antrean milik Anda sendiri yang dapat diedit: putaran tujuan atau balasan pertanyaan di antrean tidak. Setelah plugin diperbarui, hanya pengeditan teks yang langsung berfungsi: mulai ulang dsh sebelum menyimpan pesan dengan gambar atau file (bagian Host dimuat saat dsh dimulai).
@@ -234,6 +261,8 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
234
261
  - **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.
235
262
  - **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).
236
263
  - **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.
264
+ - **Obrolan menunggu berikutnya** menghitung obrolan yang sama dengan **Buka obrolan yang menunggu saat tidak aktif**: titik oranye dsh (pertanyaan, persetujuan, atau tinjauan rencana yang dapat Anda jawab di sini) dan titik hijau (giliran selesai yang belum Anda buka); permintaan subagen tampil di obrolan induknya. dsh tidak mencatat kapan sebuah obrolan mulai menunggu, jadi urutannya dihitung sejak jendela ini melihatnya: setelah dimuat ulang, obrolan yang sudah menunggu tetap mengikuti urutan dsh. Tombol pintasnya adalah pintasan dsh: di browser pada Linux, pintasan ini belum punya tombol sampai Anda menetapkannya di halaman pintasan keyboard dsh, dan ekstensi browser atau aplikasi lain dapat mengambil `Cmd+Shift+E` lebih dulu. Kepala bilah samping dsh tidak punya tempat untuk ekstensi, jadi tombol dimasukkan ke struktur kepala itu. Jika pembaruan dsh mengubahnya, tombol tidak tampil, tetapi tombol pintas tetap berfungsi. Tombol tidak ada di bilah samping yang sempit.
265
+ - **Tombol opsi** hanya membaca jawaban yang diakhiri daftar opsi: daftar bernomor 1 sampai 9 butir, dimulai dari nomor 1, sebagai bagian terakhir jawaban, tepat di bawah judul atau baris tebal "Opsi", "Pilihan", atau "Langkah selanjutnya" (atau kata bahasa Inggris "Options", "Choices", dan "Next steps", serta kata yang sama dalam bahasa lain aplikasi). Daftar di tengah jawaban, di dalam blok kode, atau di bawah judul lain tidak mendapat tombol. Composer Plus tidak meminta agen menulis daftar seperti itu. Tombol hanya muncul di bawah jawaban terbaru, saat obrolan sedang diam dan kotak pesan kosong, dan hanya setelah Composer Plus tahu jawaban mana yang ditarik oleh rollback. Pada kartu pertanyaan dsh, tombol 1–9 tidak melakukan apa pun dalam 0,8 detik pertama setelah pertanyaan muncul, agar tombol yang Anda tekan untuk hal lain tidak memilih opsi yang belum Anda baca. dsh tidak punya API tombol keyboard untuk kartu pertanyaannya, jadi tombol 1–9 mencari tombol pilihan kartu itu di markup dsh. Jika pembaruan dsh mengubah markup itu, tombol 1–9 tidak melakukan apa pun.
237
266
  - Notifikasi yang dikirim sebelum mulai ulang hanya membawa dsh ke depan saat diklik.
238
267
  - 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.
239
268
  - 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.
@@ -249,9 +278,16 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
249
278
  - **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.
250
279
  - **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.
251
280
  - **Langkah terencana** menghemat token hanya ketika model benar-benar merencanakan: selama aktif, setiap permintaan membawa alat `plan_next_steps` dan instruksi singkat (sekitar 500 token), juga di obrolan tempat model tidak pernah merencanakan. Sebuah syarat hanya membuktikan apa yang tertulis (misalnya: kode keluar build adalah 0), bukan bahwa pekerjaannya benar. `ok` membaca tanda hasil milik dsh sendiri (`[exit code: N]`, batas waktu, penolakan sandbox); perintah yang gagal tanpa kode keluar bukan nol dianggap lolos. Langkah berjalan satu per satu; dua langkah yang siap bersamaan kembali ke model. Pesan langkah disimpan sebagai pesan asisten dari model obrolan (dsh tidak punya tanda untuk pesan yang ditulis plugin), jadi teksnya menyebutkan bahwa Composer Plus yang menjalankannya. Tidak ada di Tether.
252
- - **Papan tugas** menampilkan obrolan yang didaftar dsh di jendela ini: obrolan di luar proyek hanya tampil di **Semua proyek**, dan folder branch per obrolan (`<project>/.worktrees/<name>`) dihitung sebagai proyeknya. Kolom kartu adalah status langsung obrolannya, jadi kartu tidak bisa diseret: obrolan pindah ke **Selesai** saat gilirannya berakhir, juga setelah error atau dihentikan, dan kembali ke **Sedang dikerjakan** saat berjalan lagi. Titik hijau adalah titik selesai milik dsh sendiri, yang hanya disimpan dsh di jendela ini: setelah halaman dimuat ulang, obrolan yang selesai tampil tanpa titik itu. **Selesai** menampilkan 50 obrolan terbaru (**Tampilkan N yang lebih lama** menampilkan sisanya). **Cari proyek** menemukan proyek hanya berdasarkan namanya, bukan berdasarkan jalur foldernya. **Aktif dalam 2 jam terakhir** menyembunyikan proyek jika setiap obrolannya lebih lama dari 2 jam, tidak aktif, dan sudah dibaca; papan tetap menampilkan proyek yang Anda pilih. **Tugas baru** hanya mengingat obrolan baru terbaru di jendela ini: jika Anda membuka obrolan lain sebelum pesan pertama, obrolan itu tetap di **Akan dikerjakan** sebagai **Tugas baru** sampai Anda menulis di dalamnya, tetapi papan kembali dengan sendirinya hanya untuk yang terbaru. Setelah halaman dimuat ulang, obrolan baru tanpa pesan tidak ada di papan (dsh menyimpannya sebagai Sesi Baru miliknya yang kosong). Label berasal dari satu panggilan model per tugas, dari pesan pertamanya: label bisa salah, dan obrolan yang tidak Anda mulai di papan tidak punya label. Judulnya adalah judul obrolan milik dsh sendiri (layanan judul dsh, dengan model obrolan); sampai judul itu ada, kartu menampilkan baris pertama dari pesan pertama. **Jawab** hanya menjawab permintaan terbaru obrolan: jika permintaan itu sudah dijawab di tempat lain (jendela lain, Tether, Tinjauan otomatis) atau obrolan menanyakan hal baru, panel memberi tahu hal itu dan tidak mengirim apa pun. Versi sebelumnya punya daftar tugas dengan komentar dan alat agen; semuanya sudah tidak ada, dan `board.json` lama tidak ditampilkan. Ide dan tampilannya berasal dari [Kanzo](https://github.com/emanuele-em/kanzo) karya emanuele-em (AGPL-3.0); Composer Plus tidak memakai kodenya.
281
+ - **Papan tugas** menampilkan obrolan yang didaftar dsh di jendela ini: obrolan di luar proyek hanya tampil di **Semua proyek**, dan folder branch per obrolan (`<project>/.worktrees/<name>`) dihitung sebagai proyeknya. Kolom kartu adalah status langsung obrolannya, jadi kartu tidak bisa diseret: obrolan pindah ke **Selesai** saat gilirannya berakhir, juga setelah error atau dihentikan, dan kembali ke **Sedang dikerjakan** saat berjalan lagi. Titik hijau adalah titik selesai milik dsh sendiri, yang hanya disimpan dsh di jendela ini: setelah halaman dimuat ulang, obrolan yang selesai tampil tanpa titik itu. **Selesai** menampilkan 50 obrolan terbaru (**Tampilkan N yang lebih lama** menampilkan sisanya). **Cari proyek** menemukan proyek hanya berdasarkan namanya, bukan berdasarkan jalur foldernya. **Aktif dalam 2 jam terakhir** menyembunyikan proyek jika setiap obrolannya lebih lama dari 2 jam, tidak aktif, dan sudah dibaca; papan tetap menampilkan proyek yang Anda pilih. **Tugas baru** hanya mengingat obrolan baru terbaru di jendela ini: jika Anda membuka obrolan lain sebelum pesan pertama, obrolan itu tetap di bagian paling atas **Sedang dikerjakan** sebagai **Tugas baru** sampai Anda menulis di dalamnya, tetapi papan kembali dengan sendirinya hanya untuk yang terbaru. Setelah halaman dimuat ulang, obrolan baru tanpa pesan tidak ada di papan (dsh menyimpannya sebagai Sesi Baru miliknya yang kosong). Label berasal dari satu panggilan model per tugas, dari pesan pertamanya: label bisa salah, dan obrolan yang tidak Anda mulai di papan tidak punya label. Judulnya adalah judul obrolan milik dsh sendiri (layanan judul dsh, dengan model obrolan); sampai judul itu ada, kartu menampilkan baris pertama dari pesan pertama. **×** dan **Bersihkan semua** hanya mengeluarkan kartu dari papan: tidak ada obrolan yang dihapus. **Urungkan** hanya tampil selama 8 detik, di jendela ini; setelah itu, **Dikeluarkan (N)** → **Kembalikan** mengembalikan kartu, dan obrolan yang berjalan lagi kembali dengan sendirinya. **Bersihkan semua** bertanya dulu dan mengeluarkan kartu selesai yang sudah dibaca dari proyek yang ditampilkan (semua proyek dengan **Semua proyek**), termasuk kartu di balik **Tampilkan N yang lebih lama**; kartu yang belum dibaca (hijau) tetap ada. dsh menyimpan titik hijaunya hanya di jendela ini, jadi setelah halaman dimuat ulang, Bersihkan semua bisa mengeluarkan kartu yang jawabannya belum Anda baca. Daftarnya disimpan di Mac ini untuk setiap jendela dan untuk Tether; saat daftar berisi 5.000 obrolan, yang paling lama kembali. **Jawab** hanya menjawab permintaan terbaru obrolan: jika permintaan itu sudah dijawab di tempat lain (jendela lain, Tether, Tinjauan otomatis) atau obrolan menanyakan hal baru, panel memberi tahu hal itu dan tidak mengirim apa pun. Versi sebelumnya punya daftar tugas dengan komentar dan alat agen; semuanya sudah tidak ada, dan `board.json` lama tidak ditampilkan. Ide dan tampilannya berasal dari [Kanzo](https://github.com/emanuele-em/kanzo) karya emanuele-em (AGPL-3.0); Composer Plus tidak memakai kodenya. `Cmd+Shift+K` adalah pintasan dsh: di browser pada Linux, pintasan ini tidak punya tombol bawaan (atur di halaman pintasan keyboard dsh), dan ekstensi browser atau aplikasi lain bisa memakainya lebih dulu. Kartu keluar dari **Selesai** saat titik hijau dsh sendiri hilang (Anda membuka obrolannya) atau, untuk obrolan yang selesai di belakang papan saat menjadi obrolan yang terbuka, saat obrolan itu tampil tanpa panel di atasnya. Status dibaca ini hanya ada di jendela dsh ini, seperti titik dsh: setelah memuat ulang atau di jendela lain, setiap obrolan selesai dianggap sudah dibaca, jadi ada di **Baru selesai**.
253
282
  - **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.
254
283
  - **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.
284
+ - **Riwayat versi memori** menyimpan 50 versi terbaru dari setiap memori (setiap proyek dan memori global); yang lebih lama dihapus. Satu versi berisi seluruh memori proyek itu, bukan satu catatan. **Pulihkan** mengembalikan semua file dari versi itu (termasuk topik) dan menolak jika memori berubah setelah Anda membuka versi itu; memori sebelum pemulihan menjadi versi baru, jadi Anda bisa membatalkannya. Selama sakelar nonaktif, tidak ada versi baru yang disimpan dan **Pulihkan** menolak; versi yang sudah disimpan tetap ada. Tidak ada versi dari sebelum fitur ini: riwayat dimulai dari penyimpanan pertama setelah Anda memasangnya.
285
+ - **Ekspor memori ke AGENTS.md** hanya menulis catatan dari memori satu proyek; catatan global, sumber, dan tanggal tidak ikut. Ekspor berikutnya mengganti seluruh bagian bertanda, jadi perubahan yang Anda buat sendiri di dalamnya hilang (diff menampilkannya dulu); teks di luar tanda tetap ada. Jika tandanya rusak (salah satu tidak ada atau muncul dua kali), ekspor menolak sampai Anda memperbaikinya. AGENTS.md lebih dari 512 kB, tautan simbolis yang keluar dari folder proyek, dan apa pun selain file biasa ditolak. Jika AGENTS.md atau catatan berubah setelah pratinjau, **Tulis AGENTS.md** menolak dan Anda mengekspor lagi.
286
+ - **Tautan sumber catatan memori** berlaku untuk catatan yang disimpan setelah Anda memasang versi ini: catatan yang lebih lama hanya menyebut chatnya (atau tidak sama sekali), jadi **Sumber** hanya membuka chat atau tidak tampil. Jika pesannya sudah tidak ada (ditarik oleh rollback, atau chat dihapus), chat terbuka dan pemberitahuan mengatakan pesan itu tidak ada.
287
+ - **Salin memori ke proyek lain** menyalin paling banyak 100 catatan sekaligus, dan hanya ke proyek yang ada di daftar dsh (membaca daftar proyek dsh sendiri; tidak ada path dari jendela). Setiap salinan berdiri sendiri: perubahan catatan di satu proyek setelahnya tidak mengubah salinannya. Jika satu catatan yang dicentang tidak muat (MEMORY.md atau topik tujuan penuh, atau sudah ada 40 topik), tidak ada yang disalin. Catatan yang teks dan topiknya sudah ada di tujuan dilewati, dan jumlahnya disebutkan.
288
+ - **Temukan catatan memori yang usang** hanya menemukan apa yang ditulis catatan dalam bentuk yang dikenalnya: path dalam potongan kode (`src/cart.ts`), skrip npm setelah `npm run` (atau `npm test`, `pnpm lint`), nama branch dalam potongan kode di dekat kata "branch". Path yang keluar dari folder proyek tidak dilaporkan; skrip hanya diperiksa jika proyek punya `package.json`, branch hanya di repositori git. Paling banyak 200 hal diperiksa sekaligus. Peringatan berarti "tidak ditemukan sekarang", bukan "salah": file yang dibuat build nanti juga dilaporkan.
289
+ - **Jangan gunakan memori di chat ini** berlaku mulai permintaan model berikutnya dari chat itu: permintaan yang sudah berjalan tetap seperti adanya. Mengubahnya di chat yang sedang berjalan mengubah prompt sistemnya sekali, sehingga satu permintaan itu tidak bisa memakai cache penyedia model. Subagen mengikuti chat akarnya. Tinjauan tidak membaca pesan yang diterima chat selama memorinya nonaktif, juga jika Anda mengaktifkannya lagi nanti. Di dsh 0.2.0 layar chat baru tidak punya tempat untuk tombol itu: tombol muncul di kepala chat setelah pesan pertama.
290
+ - **Sarankan catatan memori dari chat** menampilkan paling banyak 10 saran dan menyimpannya selama 30 menit dan sampai dsh dimulai ulang; setelah itu, menerima meminta Anda meminta saran lagi. Chat yang panjang mengirim pesan terbarunya: balasan agen paling lama dibuang lebih dulu. Saran bisa salah: baca sebelum menerimanya, dan gunakan **Buka memori** untuk mengubah catatan nanti. Saran yang ditolak bisa muncul lagi pada klik berikutnya.
255
291
  - **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.
256
292
  - **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.
257
293
  - **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.
@@ -286,7 +322,13 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
286
322
 
287
323
  **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.
288
324
 
289
- **Bisakah saya melihat semua obrolan saya sebagai papan kanban dan memulai obrolan baru dari sana?** Bisa, dengan **Papan tugas** (aktif secara default): buka di bilah samping kiri. Setiap obrolan adalah kartu di **Sedang dikerjakan**, **Ditinjau** (obrolan menunggu Anda), atau **Selesai**. **Tugas baru** membuka obrolan baru dsh di proyek, dan papan kembali saat pesan pertama Anda terkirim; klik **Jawab** di kartu oranye untuk menjawabnya tanpa membuka obrolan.
325
+ **Saya atau AI membuat perubahan yang salah pada memori. Bisakah saya mendapatkan catatan lama kembali?** Bisa, dengan **Riwayat versi memori** (aktif secara default): di **Buka memori**, pilih proyek, lalu **Riwayat**. Pilih versi sebelum perubahan untuk melihat apa yang kembali, lalu **Pulihkan**.
326
+
327
+ **Bisakah saya membagikan memori proyek dengan tim atau alat agen lain?** Bisa, dengan **Ekspor memori ke AGENTS.md** (aktif secara default): di **Buka memori**, pilih proyek, lalu **Ekspor ke AGENTS.md**. Periksa diff, lalu **Tulis AGENTS.md**, dan commit file itu.
328
+
329
+ **Bisakah AI menyarankan apa yang disimpan dari chat yang panjang?** Bisa, dengan **Sarankan catatan memori dari chat** (aktif secara default selama **Memori proyek** aktif): klik **Sarankan untuk memori** di kepala chat, lalu **Terima** catatan yang layak disimpan.
330
+
331
+ **Bisakah saya melihat semua obrolan saya sebagai papan kanban dan memulai obrolan baru dari sana?** Bisa, dengan **Papan tugas** (aktif secara default): buka di bilah samping kiri. Setiap obrolan adalah kartu di **Sedang dikerjakan**, **Ditinjau** (obrolan menunggu Anda), atau **Selesai**. **Tugas baru** membuka obrolan baru dsh di proyek, dan papan kembali saat pesan pertama Anda terkirim; klik **Jawab** di kartu oranye untuk menjawabnya tanpa membuka obrolan. **Bersihkan semua** di **Selesai** bertanya dulu dan mengeluarkan kartu selesai yang sudah Anda baca dari papan; **Urungkan** dan **Dikeluarkan (N)** mengembalikannya, dan obrolannya tetap ada di dsh.
290
332
 
291
333
  **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.
292
334
 
@@ -314,10 +356,22 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
314
356
 
315
357
  **Bagaimana cara menghentikan agen agar tidak menjalankan `npm publish` atau `git push --force`?** **Pengaturan → Composer Plus → Perintah yang diblokir**: ketik `npm publish`, pilih **blokir** atau **tanya dulu**, lalu klik **Tambah**. **blokir** menolak perintah itu dan agen bertanya kepada Anda; **tanya dulu** menampilkan kartu persetujuan setiap kali. File yang dilindungi mencakup alat file agen; Perintah yang diblokir mencakup perintah shell-nya.
316
358
 
359
+ **Bisakah saya memberi tahu agen mengapa saya menolak panggilan alat?** Bisa, dengan **Tolak dengan catatan** (aktif secara default): klik **Tolak dengan catatan…** pada kartu persetujuan, tulis alasannya atau apa yang harus dilakukan sebagai gantinya, lalu klik **Tolak**. Agen membaca penolakan dan catatan Anda di giliran yang sama.
360
+
361
+ **Bagaimana memberi agen kata sandi atau token tanpa menulisnya di obrolan?** Dengan **Input rahasia** (aktif secara default): minta agen memakai `request_secret`, atau tunggu sampai agen memintanya. Ketik nilai di kartu pada baris alat dan klik **Simpan**. Agen hanya menerima path file yang berisi nilai, dan file dihapus saat giliran berakhir.
362
+
363
+ **Bagaimana membalas hanya satu bagian dari jawaban yang panjang?** Pilih bagian itu dan klik **Kutip** di atas pilihan (**Kutip dalam balasan**, aktif secara default). Bagian itu masuk ke kolom ketik sebagai kutipan `> …`, dan Anda menulis balasan di bawahnya.
364
+
365
+ **Bisakah saya bertanya saat agen bekerja, tanpa menghentikannya?** Ketik pertanyaan dan klik **Tanya di obrolan samping** di kolom ketik (**Obrolan samping**, aktif secara bawaan). Salinan obrolan yang hanya baca menjawabnya sementara obrolan terus bekerja. Di obrolan samping, **Bawa kembali** menaruh jawaban di kolom ketik obrolan.
366
+
367
+ **Bagaimana memberi tahu agen apa yang harus diubah di diff-nya?** Di **Panel perubahan**, buka diff file, klik **+** pada sebuah baris, dan tulis catatan (**Catatan diff**, aktif secara bawaan). Lalu klik **Kirim ke kolom ketik**: catatan masuk ke kolom ketik bersama file, nomor baris, dan barisnya.
368
+
317
369
  **Bagaimana cara menghentikan Tinjauan otomatis agar tidak terus bertanya tentang alat yang sama dalam satu obrolan?** Klik **Izinkan untuk obrolan ini** pada kartu persetujuan. Izin ini hanya mencakup alat itu di obrolan itu, selama 1 jam secara default; cabut izin dari chip di header. Ubah waktunya di **Pengaturan → Composer Plus → Izinkan untuk obrolan ini**.
318
370
 
319
371
  **iPhone saya hilang. Bagaimana cara mencegahnya mengakses Mac saya?** Klik **Koneksi seluler** di kiri bawah bilah samping, lalu klik **Remove** di samping iPhone itu. Kuncinya langsung tidak berfungsi; iPhone itu hanya dapat kembali dengan pemasangan baru yang Anda setujui di Mac.
320
372
 
373
+ **Bagaimana cara melanjutkan obrolan dari Mac saya yang lain di Mac ini?** Di Mac yang lain, aktifkan **Pengaturan → Composer Plus → Komputer jarak jauh** dan **Izinkan komputer lain membuka Mac ini**, klik **Buat tautan pemasangan**, lalu salin tautannya (kirim ke diri Anda sendiri, misalnya dengan AirDrop atau Catatan). Di Mac ini, aktifkan juga **Komputer jarak jauh**, pilih **Tambahkan komputer…** di sebelah kiri judul obrolan, tempel tautannya, lalu klik **Hubungkan**. Setelah itu, klik **Setujui** di Mac yang lain. Sejak saat itu, pilih komputer tersebut di menu yang sama.
374
+
321
375
  **Bisakah saya mengunci Tether dengan Face ID?** Bisa: di Tether, aktifkan "Settings → Privacy → Lock with Face ID". Setelah itu, Tether meminta Face ID (atau kode sandi) saat dibuka dan saat Anda kembali ke aplikasi itu.
322
376
 
323
377
  **Bagaimana cara hanya menampilkan proyek yang saya pakai hari ini di bilah samping dsh?** Bilah samping → opsi tampilan (ikon slider) → **Aktif dalam 2 jam terakhir**. Pilih lagi untuk menampilkan semua proyek.
@@ -330,6 +384,10 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
330
384
 
331
385
  **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.
332
386
 
387
+ **Bisakah saya langsung pindah ke obrolan berikutnya yang menunggu saya?** Bisa, dengan **Obrolan menunggu berikutnya** (aktif secara default): tekan `Cmd+Shift+E` (`Ctrl+Shift+E` di Windows dan Linux) atau klik tombol berangka di kepala bilah samping. Obrolan yang mengajukan pertanyaan atau menunggu persetujuan didahulukan, lalu obrolan yang menyelesaikan giliran yang belum Anda baca.
388
+
389
+ **Bisakah saya menjawab opsi dari agen dengan satu klik?** Bisa, dengan **Tombol opsi** (aktif secara default): saat jawaban diakhiri daftar "Opsi", klik salah satu tombol di bawahnya. Tombol itu mengirim "Option N: …" sebagai pesan Anda. Pada kartu pertanyaan agen, tekan 1–9.
390
+
333
391
  **Bagaimana cara mengganti antarmuka DeepSeek Harness ke bahasa Turki, Spanyol, Jepang…?** Pengaturan → Composer Plus → **Bahasa aplikasi**.
334
392
 
335
393
  **Bagaimana cara memakai dsh dari iPhone saya?** Bangun aplikasi Tether dari `tether/ios` (Xcode), aktifkan **Pengaturan → Composer Plus → Koneksi seluler (iPhone)**, klik **Koneksi seluler** di kiri bawah, pindai kode QR (Kamera iPhone atau **Scan code** di Tether), ketuk **Connect**, lalu klik **Approve**. Saat jauh dari rumah, gunakan Tailscale di kedua perangkat.
@@ -359,6 +417,10 @@ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/ds
359
417
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
360
418
  # Order by status (fake model + Schedule): real-app test + its thumbnail
361
419
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
420
+ # Next waiting chat and Option buttons (fake model): the sidebar button and Cmd+Shift+E open the waiting chats in order, the Keyboard shortcuts row, the option buttons and the question card keys, switch off + their thumbnails
421
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
422
+ # Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
423
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
362
424
  # every Settings feature row shows a loading screenshot and a ? link to its README row
363
425
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
364
426
  # What's new after an update: the release notes show once, Esc and Close close them
@@ -408,7 +470,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
408
470
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
409
471
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
410
472
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
- # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, Hide finished, the switch
473
+ # 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
412
474
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
413
475
  ```
414
476