SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-29

Plugin dsh: Cara Kerja dan Cara Memeriksanya

Plugin dsh menjalankan kode pihak lain dengan permission agent Anda. Ketahui aksesnya dan ikuti pemeriksaan praktis sebelum menginstalnya di mesin Anda.

Apa itu plugin dsh, dan apa yang dapat dilakukannya?

Plugin dsh adalah package Node yang dimuat DeepSeek Harness ke dalam prosesnya sendiri. Menginstalnya berarti menjalankan kode pihak lain dengan permission agent Anda, pada mesin yang sudah dapat dijangkau agent tersebut. Tidak ada pembatas antara plugin yang dimuat dan bagian lain dari harness. Jadi, sebelum menginstal plugin, tanyakan kode tersebut dapat mengakses apa dan bagaimana Anda membatasi aksesnya.

dsh (DeepSeek Harness) adalah agent harness open-source milik DeepSeek AI yang dibangun di atas framework plugin bernama Cordis. Bagian tengah tersebut sangat penting, karena agent harness adalah program yang mengelilingi model dan mengelola loop, tools, serta permission. Plugin bergabung pada level yang sama. README proyek tersebut menyatakan bahwa semuanya adalah plugin. Model adapter adalah plugin. Antarmuka web yang Anda gunakan untuk mengetik juga merupakan plugin. Apa pun yang Anda instal dari luar proyek masuk ke tree yang sama, dengan tingkat kepercayaan yang sama seperti komponen yang disertakan dalam proyek. Jika Anda belum menjalankannya, mulai dengan DeepSeek Harness pada VPS dan kembali ke sini sebelum menambahkan apa pun.

Extension point yang dapat dijangkau plugin tercantum dalam AGENTS.md repository. Per Agustus 2026, extension point tersebut mencakup:

  • LLM (large language model): provider yang menggunakan API key Anda
  • Shell: kemampuan bash, dengan provider local dan pwsh
  • Filesystem: akses file yang dikendalikan oleh policy
  • Web: provider untuk search dan fetch
  • Subprocess: provider untuk process tree
  • Workflow: worker thread
  • Subagent: delegasi ke agent tambahan
  • Settings dan credentials: konfigurasi tersimpan serta environment variable Anda

Plugin juga mendaftarkan tools pada ctx.tools, dan dokumentasi menjelaskan secara eksplisit bahwa schema tool yang terdaftar ikut dalam penyusunan prompt. Bagian kedua ini sering terlewatkan. Plugin dapat mengubah keputusan agent tanpa harus melakukan sesuatu yang tidak biasa melalui kodenya sendiri, karena deskripsi yang ditambahkannya menjadi teks yang dibaca model. Bentuk masalahnya sama dengan prompt injection terhadap coding agent, dengan satu perbedaan: teks ini masuk saat Anda menginstal plugin dan tetap ada sampai plugin tersebut dihapus.

Bagaimana dsh menemukan dan memuat plugin?

Tidak ada direktori plugin global. dsh yang sedang berjalan adalah pohon plugin yang disusun saat boot dari beberapa layer berurutan, dan unit yang menyimpan pilihan Anda disebut profile. $DSH_HOME secara default adalah ~/.dsh, dan setiap profile berada di $DSH_HOME/profiles/<name>. Profile web dan headless dibuat secara otomatis saat pertama kali digunakan berdasarkan template yang disertakan.

Direktori profile berisi dua file yang menentukan seluruh konfigurasi:

  • package.json, yang berisi dependensi plugin di luar tree beserta manifest dsh.profile yang memuat daftar bundles secara berurutan
  • cordis.patch.yml, layer patch Anda sendiri di atas bundle tersebut
ls ~/.dsh
ls ~/.dsh/profiles/web

Saat boot, layer diterapkan dalam urutan berikut. Layer yang diterapkan belakangan memiliki prioritas lebih tinggi:

  1. root kosong
  2. bundle milik profile, sesuai urutan dalam manifest
  3. cordis.patch.yml milik profile
  4. $DSH_HOME/cordis.patch.yml
  5. overlay --patch <path> apa pun yang diberikan melalui command line

Dua flag berikut menampilkan hasil komposisi tersebut tanpa menjalankan apa pun:

dsh --profile web --dump-default-config
dsh --profile web --dump-config

--dump-default-config hanya menampilkan tree hasil komposisi. --dump-config menambahkan layer patch profile dan home, sehingga hasilnya paling mendekati inventaris yang akurat tentang hal-hal yang akan dimuat pada boot berikutnya. Baca hasilnya sebelum mempercayai mesin yang Anda warisi.

Perhatikan satu hal tentang file patch tersebut. Config bukan sekadar data pasif di sini, karena formatnya memungkinkan nilai bertanda !!js di dalam blok config milik plugin. Snippet cordis.patch.yml yang disalin dari sebuah posting forum adalah kode. Perlakukan snippet tersebut seperti Anda memperlakukan shell script dari sumber yang sama.

Apa yang sebenarnya dijalankan oleh dsh plugin add?

dsh plugin --profile <name> <args> meneruskan argumennya ke pnpm di dalam direktori profil tersebut, sehingga pnpm harus tersedia di PATH. Kata kerja tersebut adalah kata kerja pnpm:

dsh plugin --profile web add '<package-or-git-spec>'
dsh plugin --profile web remove '<package-name>'
dsh plugin --profile web why '<package-name>'
dsh plugin --profile web update

Model keamanan untuk menginstal plugin dsh adalah model keamanan untuk menginstal dependensi bergaya npm, ditambah satu langkah ekstra ketika hasilnya dimuat ke dalam agent Anda. Paket tersebut membawa pohon dependensinya sendiri, dan setiap paket dalam pohon itu akhirnya berjalan dalam proses yang sama. Semua hal dalam cara serangan rantai pasokan npm menjangkau server berlaku di sini tanpa perubahan.

pnpm 10 dan versi setelahnya tidak menjalankan skrip build dependensi secara default, dan persetujuan diberikan per paket melalui onlyBuiltDependencies atau pnpm approve-builds. Periksa versi pnpm yang Anda gunakan:

pnpm --version

Default tersebut memang berguna, tetapi juga merupakan fitur keamanan yang paling sering disalahpahami dalam ekosistem ini. Skrip build yang diblokir mencegah kode berjalan selama instalasi. Skrip tersebut tidak melakukan apa pun terhadap plugin itu sendiri, karena tujuan utama plugin adalah agar harness mengimpornya dan memanggilnya saat boot berikutnya. Plugin tidak memerlukan hook postinstall. Plugin tersebut memang sengaja dimuat.

Bacaan sebelum menginstal plugin dsh

Unduh tarball yang dipublikasikan, lalu baca isinya. Tidak ada yang dieksekusi saat Anda membongkar arsip.

npm pack '<package-name>@<version>'
tar -tzf '<package-name>-<version>.tgz'
tar -xzf '<package-name>-<version>.tgz'
less package/package.json

Empat kolom dalam package.json tersebut memberi Anda sebagian besar informasi yang diperlukan. Baca scripts untuk entri preinstall, install, dan postinstall. Baca dependencies untuk nama yang tidak Anda kenali, atau nama yang berbeda satu karakter dari nama yang Anda kenali. Baca bin untuk mengetahui apa saja yang ingin ditambahkan paket ke PATH Anda. Baca main atau exports untuk menemukan file entri, lalu buka file tersebut dan ikuti alurnya.

Selanjutnya, baca kode yang benar-benar akan dimuat. Plugin yang mengiklankan alat notifikasi tidak memiliki alasan untuk membaca ~/.ssh, memanggil host yang belum pernah Anda dengar, atau menjalankan shell. Jika paket hanya menyediakan JavaScript yang sudah dibundel atau diminifikasi dan tidak ada source code yang sesuai di repository publik, itulah jawabannya. Pilih plugin yang source code-nya dapat Anda baca, dan utamakan plugin yang berukuran kecil.

Anda juga dapat memeriksa registry tanpa menginstal apa pun:

pnpm view '<package-name>' dependencies
pnpm view '<package-name>' versions

Paket yang dipublikasikan minggu lalu, hanya memiliki satu versi, tidak memiliki field repository, dan menggunakan nama yang menyerupai sesuatu yang populer merupakan trik paling lama di registry mana pun. Memverifikasi unduhan dengan checksum adalah kebiasaan yang melengkapinya: ketahui dengan tepat apa yang Anda unduh sebelum membiarkannya berjalan.

Kunci versinya dan pertahankan lockfile

Rentang versi yang tidak dikunci berarti kode di dalam proses agent Anda dapat berubah setiap kali instalasi atau pembaruan dilakukan tanpa keputusan dari Anda. Kunci versinya.

dsh plugin --profile web add --save-exact '<package-name>@<version>'

Penempatan flag berbeda-beda pada setiap versi pnpm. Karena itu, periksa hasilnya dan jangan hanya mempercayai perintah tersebut. Buka package.json milik profile setelahnya, lalu pastikan dependensi tersebut ditulis sebagai versi tanpa awalan ^ atau ~. File itu menentukan apa yang akan diinstal.

Selanjutnya, pertahankan lockfile. File ini mengunci seluruh pohon dependensi transitive, bukan hanya nama dependensi tingkat teratas:

find ~/.dsh -maxdepth 3 -name 'pnpm-lock.yaml'

Salin file tersebut ke lokasi yang dicadangkan bersama package.json milik profile. Kedua file itu dapat membangun ulang pohon yang sama pada server baru. Jalankan dsh plugin --profile web update hanya setelah Anda memutuskan untuk mengubah versi, bukan sebagai pembersihan rutin, lalu baca diff lockfile setelahnya.

Untuk plugin yang diinstal dari git, bukan dari registry, kunci commit-nya, bukan branch-nya. Spesifikasi dalam bentuk github:owner/repo#<full commit sha> menghasilkan pohon yang tetap. Nama branch akan mengambil apa pun yang ada pada branch tersebut saat pnpm menyelesaikan dependensi berikutnya. Dengan demikian, keputusan itu Anda serahkan kepada pihak lain. Harness juga memerlukan disiplin yang sama karena setiap build dsh yang dipublikasikan adalah kandidat rilis, dan instalasi yang tidak dikunci dapat menyelesaikan ke build yang berbeda pada hari apa pun. Inilah sumber sebagian besar error instalasi dan versi dsh.

Pasar plugin, dan nilai sebenarnya dari “terkurasi”

dsh memiliki marketplace dan memasangnya sebagai plugin. Hal ini menunjukkan sesuatu tentang arsitekturnya:

dsh plugin --profile web add dshmarket

Setelah restart, menu tersebut muncul di Settings, lalu Plugin Market. README-nya menjelaskan batasan ini dengan jelas. Instalasi dibatasi pada sumber yang tercantum dalam registry terkurasi, sedangkan sumber lainnya ditolak. Skrip build diblokir secara default, dan untuk mengaktifkannya diperlukan persetujuan per paket. Plugin terminal ditandai sebelum dimasukkan ke profil web. Pernyataan yang paling penting adalah bahwa pencantuman bukan berarti endorsement, karena plugin tersebut merupakan kode pihak ketiga.

Daftar terkurasi meningkatkan standar minimum. Namun, daftar ini tidak membaca kode untuk Anda dan tidak dapat memberi tahu apa yang akan dilakukan versi plugin berikutnya setelah akun maintainer berpindah tangan. Perlakukan instalasi sekali klik seperti Anda memperlakukan curl | bash dari penulis yang sama. Ada satu kalimat lain dari README tersebut yang perlu diulang: backup yang diekspor dapat berisi kredensial dari konfigurasi profil Anda, jadi jangan pernah melampirkannya pada issue publik atau situs paste. Jika Anda memerlukan daftar awal, bukan metode, plugin dsh yang layak diinstal adalah artikel pendamping untuk artikel ini.

Jalankan dsh sebagai pengguna sendiri, bukan sebagai root

Pemeriksaan mengurangi frekuensi masuknya hal yang berbahaya. Prinsip hak akses minimum menentukan apa yang dapat dijangkau jika hal itu tetap masuk. Pada VPS, bagian kedua ini mudah diterapkan.

Buat akun Unix khusus untuk harness, dengan direktori home sendiri, dan jangan pernah menjalankannya sebagai root:

sudo adduser --disabled-password --gecos "" dshrun
sudo -iu dshrun

Di dalam sesi tersebut, mulai harness agar direktori home dibuat di bawah akun itu:

npx @deepseek-ai/dsh web

UI web secara default berjalan pada http://127.0.0.1:3080. Biarkan tetap demikian. Jika Anda pernah mengeklik tautan yang dicetak tersebut dari mesin lain tetapi tidak menerima respons, penjelasan tentang arti alamat yang dicetak dsh menjelaskan penyebabnya. Apa pun yang dapat mencapai port tersebut dapat mengendalikan agent yang memiliki shell. Jadi, memublikasikan port 3080 sama dengan memublikasikan remote shell tanpa hak root dengan antarmuka yang mudah digunakan. Akses dari laptop melalui tunnel SSH:

ssh -L 3080:127.0.0.1:3080 you@your-vps

Kemudian pastikan tidak ada proses yang listening pada alamat publik:

ss -lnt | grep 3080

Alamat lokal harus terbaca sebagai 127.0.0.1:3080. Jika terbaca sebagai 0.0.0.0:3080, firewall Anda adalah satu-satunya penghalang antara orang asing dan agent Anda. Dasar pemikiran di balik menjalankan Claude Code dengan aman pada VPS juga berlaku untuk dsh. Berikan agent satu direktori workspace yang boleh dirusaknya, dan simpan semua hal yang tidak dapat Anda buat ulang di luar mesin tersebut. Lebih baik lagi, perlakukan mesin itu sebagai VM disposable untuk coding agent, karena membangun ulang VPS memerlukan waktu satu jam, sedangkan mengauditnya memerlukan waktu satu minggu.

Lokasi penyimpanan key dan batas perlindungan permission file

dsh menyimpan API key di $DSH_HOME/.credentials.yaml dan nilai environment di $DSH_HOME/.env, dengan pengaturan model di $DSH_HOME/settings.yaml dan riwayat sesi di $DSH_HOME/storages. Key mana yang harus disimpan di setiap file tersebut, serta data apa yang benar-benar keluar dari server dalam setiap mode, dibahas dalam mengonfigurasi API key, model, dan endpoint dsh. Hal ini sebaiknya ditetapkan sebelum Anda menambahkan plugin, karena setiap key yang Anda masukkan menjadi satu hal tambahan yang dapat dibaca plugin. Batasi akses untuk dua file sensitif berikut:

chmod 600 ~/.dsh/.credentials.yaml ~/.dsh/.env
ls -l ~/.dsh

Mode 600 memberikan izin baca dan tulis kepada pemilik, serta tidak memberikan izin apa pun kepada pengguna lain. Hal ini perlu dipahami dalam kedua notasi (mode chmod numerik versus simbolik). Pahami batas perlindungan ini. Mode file melindungi file tersebut dari account lain pada server. Mode file tidak melindunginya dari plugin, karena plugin berjalan sebagai user yang memiliki file tersebut, di dalam proses yang membacanya. Karena itu, menjauhkan secret dari jangkauan agen AI berarti tidak menyimpannya di mesin sama sekali. Server dsh sebaiknya hanya menyimpan key model yang diperlukan. Kredensial cloud dan signing key Anda harus disimpan di tempat lain.

Mengapa plugin yang membaca web mengubah model ancaman

Seam Web menyediakan provider pencarian dan pengambilan data bagi plugin. Plugin yang memasukkan halaman ke dalam sesi Anda berarti mengambil teks yang dapat ditulis oleh penyerang. Prompt model tidak memisahkan instruksi dari data, sehingga halaman yang diambil dapat memuat baris yang ditujukan kepada agent Anda. Harness yang memiliki kemampuan shell hanya memerlukan satu langkah patuh untuk menjalankannya.

Kontrol tersebut sudah tersedia di harness. dsh-base, bundle pertama dalam setiap profil, menyediakan sandbox dan kebijakan persetujuan. Gunakan kontrol itu. Sesi yang dapat mengambil halaman tidak tepercaya harus meminta persetujuan untuk tindakan apa pun yang menulis atau mengeksekusi sesuatu. Dengan demikian, instruksi dari halaman yang diambil tidak dapat menjadi tindakan secara otomatis. Membatasi tindakan agent dengan persetujuan menjelaskan cara menentukan batas tersebut. Hubungan ini juga berlaku sebaliknya. Server Anda sendiri adalah halaman yang akan diambil oleh agent milik orang lain. Karena itu, lihat juga memblokir crawler AI pada server Anda.

Bagaimana cara memeriksa perubahan yang dibuat plugin?

Buat snapshot sebelum instalasi, instal plugin, buat snapshot setelah instalasi, lalu baca perbedaannya.

dsh --profile web --dump-config > /tmp/dsh-before.txt
dsh plugin --profile web add '<package-name>@<version>'
dsh --profile web --dump-config > /tmp/dsh-after.txt
diff -u /tmp/dsh-before.txt /tmp/dsh-after.txt

Diff menunjukkan entri plugin yang ditambahkan oleh instalasi ke composed tree. Jika plugin yang Anda instal untuk satu fitur kecil menambahkan beberapa entri yang tidak dapat Anda jelaskan, hentikan proses dan baca source code sebelum melakukan boot. dsh plugin --profile web why <package-name> menjawab pertanyaan lainnya: dependensi langsung mana yang menarik package tertentu.

Package yang diinstal berada di bawah $DSH_HOME/profiles/node_modules, sehingga Anda juga dapat melihat tree pada disk:

ls ~/.dsh/profiles/node_modules

Simpan profile kedua yang tidak pernah digunakan untuk eksperimen. Jika instalasi merusak harness, lakukan boot pada dsh --profile <clean-name> untuk mengetahui dalam hitungan detik apakah plugin tersebut penyebabnya.

Bagaimana cara menghapus plugin dsh?

dsh plugin --profile web remove '<package-name>'
dsh --profile web --dump-config > /tmp/dsh-after-removal.txt
diff -u /tmp/dsh-before.txt /tmp/dsh-after-removal.txt

Menghapus dependensi tidak selalu menghapus konfigurasi. Entri yang ditulis ke dalam cordis.patch.yml milik profile tetap berada di sana, karena file tersebut adalah milik Anda dan harness tidak akan menulis ulang file itu untuk Anda. Buka file tersebut, lalu hapus setiap blok yang mencantumkan package yang Anda hapus.

less ~/.dsh/profiles/web/cordis.patch.yml

Selanjutnya, tangani hal yang tidak dapat diperbaiki oleh perintah uninstall apa pun. Jika Anda menghapus plugin karena tidak lagi mempercayainya, semua data yang dapat dibacanya mungkin sudah dibaca. Rotate DeepSeek API key di provider console, lalu rotate semua hal lain yang tersimpan di $DSH_HOME. Setelah itu, tentukan resource apa saja di bagian lain network Anda yang dapat diakses oleh unix account yang digunakan plugin tersebut.

Versi singkat

  • Baca tarball yang dipublikasikan sebelum instalasi, mulai dari scripts dan file entri
  • Tetapkan versi yang tepat, atau commit yang tepat untuk spesifikasi git, dan pertahankan lockfile
  • Instal ke dalam satu profile, dan pertahankan profile bersih yang dapat Anda boot saat terjadi masalah
  • Bandingkan --dump-config sebelum dan sesudah setiap instalasi
  • Jalankan harness sebagai pengguna unix tersendiri, pada loopback, dan akses melalui SSH
  • Simpan satu kunci API di server, lalu lakukan rotasi pada hari Anda menghapus plugin yang tidak lagi Anda percayai

Semua ini bukan alasan untuk menghindari plugin. Model plugin adalah alasan dsh berguna, dan harness yang tidak dapat Anda perluas adalah harness yang akan Anda ganti. Ini adalah alasan untuk mengetahui apa yang Anda instal, dari siapa, pada versi berapa, dan menjalankan semuanya di tempat yang dapat Anda bangun ulang.

FAQ

Apakah dsh melakukan sandbox pada plugin agar saling terisolasi?

Tidak. Plugin dimuat ke dalam proses harness melalui Cordis dan dapat mengakses seam kapabilitas yang didokumentasikan, termasuk shell, filesystem, web, subprocess, subagent, dan credentials. dsh-base, bundle pertama dalam setiap profile, menyediakan sandbox dan kebijakan persetujuan yang mengatur tindakan yang dapat dilakukan oleh tool agent. Perlindungan Anda berasal dari kebijakan tersebut. Tidak ada batas izin per plugin. Model yang tepat adalah bahwa pemasangan plugin memperluas kepercayaan Anda kepada pembuatnya dan setiap package dalam dependency tree-nya.

Dapatkah saya memasang plugin dsh tanpa menjalankan skrip instalasinya?

pnpm 10 dan versi setelahnya secara default memblokir skrip build dependency, dan dsh plugin ... add meneruskan perintah ke pnpm. Karena itu, pada pnpm versi terbaru, instalasi tidak menjalankan skrip package kecuali Anda menyetujui package tersebut. Konfirmasikan versi Anda dengan pnpm --version. Hal ini tidak membuat plugin yang belum Anda baca menjadi aman. Kode plugin sendiri berjalan saat boot berikutnya karena harness sengaja memuatnya. Pembatasan saat instalasi tidak memengaruhi proses tersebut.

Di mana sebenarnya plugin dsh dan konfigurasinya disimpan?

$DSH_HOME secara default mengarah ke ~/.dsh. Profile berada di $DSH_HOME/profiles/<name>. Setiap profile berisi package.json dengan dependency plugin-nya, serta manifest dsh.profile yang memuat bundle secara berurutan dan lapisan patch cordis.patch.yml. Package yang diinstal berada di bawah $DSH_HOME/profiles/node_modules. Key berada di $DSH_HOME/.credentials.yaml, nilai environment berada di $DSH_HOME/.env, dan $DSH_HOME/cordis.patch.yml pada level home diterapkan pada setiap profile. Jalankan dsh --profile web --dump-config untuk melihat hasil gabungannya tanpa melakukan boot.

Apakah aman menginstal dari market plugin dsh?

Market membatasi instalasi pada source dalam registry yang dikurasi dan memblokir build script sampai Anda menyetujuinya untuk setiap package. Ini merupakan peningkatan nyata dibandingkan menempelkan nama package dari jendela chat. Namun, README market tersebut tetap menyatakan bahwa pencantuman bukan endorsement karena plugin adalah kode pihak ketiga dari orang lain. Baca source dan kunci versinya. Jalankan harness pada user account, dan idealnya pada machine, yang jika hilang masih dapat Anda tanggung.