Dokumen Pengembang Plugin
Bangun plugin untuk aplikasi desktop AnBoWork: tambahkan alat baru untuk AI, letakkan panel Anda sendiri di samping sesi, kirim pemberitahuan sistem, parsing format file baru. Satu manifest.json ditambah satu skrip entri sudah cukup untuk memulai.
01Ringkasan
Plugin AnBoWork adalah program Node.js biasa. Setelah instalasi, aplikasi membaginya sebagai proses anak yang berdiri sendiri (Node murni, tanpa API Elektron) dan berkomunikasi dengannya melalui pesan antar-proses. Tidak diperlukan paket SDK; yang Anda butuhkan hanyalah process.on('message') dan process.send().
Segala sesuatu yang dapat dilakukan plugin dinyatakan secara statis di manifest.json: halaman persetujuan pra-instal dan tinjauan pasar dapat mengetahui alat mana yang ditambahkan dan izin apa yang diperlukan tanpa menjalankan kode plugin apa pun. Semua UI (ikon toolbar, pengaturan, palet perintah, menu konteks) dirender oleh host dari deklarasi; kode plugin tidak pernah berjalan di dalam jendela utama. Hanya tampilan berlabuh dan panel mengambang yang merupakan HTML Anda sendiri, dan keduanya berjalan di halaman kotak pasir yang terisolasi.
Sekilas tentang kemampuan
| Bidang manifes | Kemampuan | Tempat pengguna melihatnya |
|---|---|---|
tools | Tambahkan alat yang dapat dipanggil untuk AI | AI memanggil mereka secara otomatis dalam percakapan; panggilan alat ditampilkan dalam sesi tersebut |
views | Tampilan persisten ditempatkan di sidebar kanan sesi | Ikon tambahan di toolbar sesi membuka halaman Anda di sebelah kanan |
ui | Jendela mengambang yang berdiri sendiri | Dibuka dari menu "⋯" di daftar plugin |
sessionAction | Ikon tindakan persisten di toolbar sesi | Satu klik menjalankan alat yang Anda tentukan |
configuration | Entri di halaman pengaturan | Pengaturan → Konfigurasi plugin; nilai diteruskan dengan setiap panggilan |
commands | Entri palet perintah Ctrl/Cmd+K | Palet perintah |
keybindings | Pintasan keyboard global | Kombinasi tombol memicu perintah |
menus | Item menu konteks sesi | Menu "⋯" / klik kanan pada baris sesi |
documentParsers | Parsing file dimasukkan ke dalam kotak input | Dipanggil secara otomatis ketika pengguna menjatuhkan file yang cocok |
activationEvents | Mulailah dengan aplikasi | Tak terlihat; untuk plugin yang memerlukan pengatur waktu latar belakang |
permissions | Nyatakan izin yang diperlukan | Halaman persetujuan pra-instal |
02Mulai Cepat
Plugin minimal hanya membutuhkan dua file.
1. Tulis manifes.json
2. Tulis skrip entri
3. Instal ke dalam aplikasi
Buka AnBoWork → bilah atas "Alat" → "Plugin" → "Instal secara lokal" di pojok kanan atas, lalu pilih folder plugin (atau zipnya). Halaman persetujuan mencantumkan izin yang dinyatakan dan setiap alat sebelum instalasi; konfirmasi untuk mengaktifkan.
4. Cobalah
Di sesi mana pun, beri tahu AI "minta plugin untuk menyapa Alice". Berdasarkan deskripsi alat, AI memutuskan untuk memanggil say_hello, dan panggilan serta hasilnya muncul di sesi.
03Bidang Manifes
| Bidang | Jenis | Diperlukan | Keterangan |
|---|---|---|---|
id | string | Ya | Gaya domain terbalik, mis. com.example.my-plugin. Hanya huruf, angka, titik, dan tanda hubung. Tidak dapat diubah setelah dibuat; menginstal ulang id yang sama dianggap sebagai instalasi ulang. |
name | string | Ya | Nama plugin. Bersama dengan description ini dimasukkan ke model sebagai konteks, jadi bahasa Inggris direkomendasikan. |
version | string | Ya | Versi semantik; pasar menggunakannya untuk mendeteksi pembaruan. |
description | string | Ya | Satu kalimat yang menjelaskan fungsi plugin (Bahasa Inggris). |
author | string | TIDAK | Pengarang. |
readme | string | TIDAK | Deskripsi bentuk panjang yang ditampilkan di halaman detail pasar, mendukung Penurunan Harga. Gambar di dalamnya harus berupa https URL — jalur relatif ke file yang dibundel dalam zip tidak didukung. |
icon | string | TIDAK | Ikon ditampilkan di daftar pasar dan halaman detail — jalur relatif ke file yang dibundel dalam zip (misalnya icon.png). Harus PNG, bukan SVG, minimal 128×128. |
main | string | Ya | Skrip entri, relatif terhadap folder plugin. .. keluar dari folder tidak diperbolehkan. |
permissions | string[] | Ya | network / filesystem / notifications; mungkin array kosong. Lihat "Model Izin". |
tools | object[] | Ya | Deklarasi alat; mungkin array kosong. Lihat "Alat & Protokol Panggilan". |
documentParsers | object[] | TIDAK | Kemampuan penguraian file. |
ui | object | TIDAK | Panel mengambang:{ entry, title } |
views | object[] | TIDAK | Tampilan berlabuh:{ id, title, icon, entry, width? } |
sessionAction | object | TIDAK | Ikon toolbar, paling banyak satu per plugin. |
configuration | object[] | TIDAK | Daftar entri pengaturan. |
commands | object[] | TIDAK | Entri palet perintah. |
keybindings | object[] | TIDAK | Jalan pintas. command harus mengacu pada tool entri di commands[], jika tidak, pemasangan akan ditolak. |
menus | object | TIDAK | Hanya lokasi session/context yang tersedia untuk saat ini. |
activationEvents | string[] | TIDAK | Hanya onStartupFinished untuk saat ini. |
Konvensi bahasa untuk teks
Teks dalam manifes memiliki dua audiens. Untuk model: name, description, tools[].description, tools[].parameters.*.description. Tulis ini dalam bahasa Inggris; model memahami deskripsi alat bahasa Inggris dan parameter pengisian dengan lebih andal. Untuk orang: tools[].summary (ringkasan satu baris di halaman persetujuan), ui.title, views[].title, sessionAction.tooltip, configuration[].label, commands[].title dan title di dalam menus. Tulis ini dalam bahasa pengguna target Anda.
04Model Izin
permissions harus secara jujur mencerminkan fungsi sebenarnya dari kode tersebut. Halaman persetujuan pra-pemasangan mencantumkan masing-masing sehingga pengguna dapat memutuskan apakah akan menginstal; tinjauan pasar juga memeriksa deklarasi terhadap kode.
| Izin | Kapan harus diumumkan | Bagaimana tuan rumah memperlakukannya |
|---|---|---|
filesystem | Membaca atau menulis file pengguna (membaca kode proyek, membuat dokumen, menyimpan data di folder beranda) | Persetujuan yang diinformasikan, ditunjukkan kepada pengguna. |
network | Membuat permintaan jaringan apa pun (API pihak ketiga, unduhan) | Persetujuan yang diinformasikan, ditunjukkan kepada pengguna. |
notifications | Menampilkan notifikasi sistem melalui RPC terbalik show_notification | Enforced: memanggilnya tanpa deklarasi akan mengembalikan host_error dan tidak ada pemberitahuan yang ditampilkan. |
filesystem dan network saat ini merupakan deklarasi tingkat persetujuan, bukan runtime sandbox: host tidak mencegat fs atau fetch. Itulah sebabnya deklarasi harus jujur. Plugin yang kurang dideklarasikan akan ditolak dalam tinjauan pasar dan kehilangan kepercayaan pengguna saat ditemukan. Jangan mendeklarasikannya secara berlebihan (izin yang tidak digunakan membuat pengguna ragu).Privasi dan data
context.cwd adalah folder proyek pengguna dan mungkin berisi kode sumber dan konfigurasi sensitif; argumen alat mungkin berisi percakapan pengguna. Jangan mengirim data ini melalui jaringan kecuali fitur tersebut memerlukannya, dan bila Anda melakukannya, sebutkan di description dan summary apa yang dikirim dan kepada siapa. Simpan data persisten plugin dalam file di bawah folder beranda pengguna yang diberi nama sesuai id plugin, sehingga mudah ditemukan saat menguninstall.
05Alat & Protokol Panggilan
Pernyataan
| Bidang | Keterangan |
|---|---|
name | Nama alat dalam huruf kecil dan garis bawah, unik di seluruh aplikasi (terdaftar dengan model bersama alat bawaan dan alat plugin lainnya). |
description | Deskripsi model (Bahasa Inggris). Nyatakan tiga hal: apa yang dilakukan alat tersebut, apa yang dikatakan pengguna kapan harus dipanggil, dan kapan tidak boleh dipanggil. Ini adalah satu-satunya bidang terpenting yang menentukan apakah AI menggunakan plugin Anda. |
summary | Ringkasan satu baris yang dapat dibaca manusia ditampilkan di halaman persetujuan. Opsional tetapi sangat disarankan; jika tidak, deskripsi terpotong akan ditampilkan. |
parameters | Objek Skema JSON standar dengan description di setiap properti. Model mengisi argumen darinya dan host meneruskannya tanpa validasi tambahan, jadi periksa bidang yang wajib diisi dalam kode Anda. |
renderAs | Opsional; saat ini hanya checklist: host merender array todos dari argumen panggilan sebagai kartu daftar periksa, lihat di bawah. |
tools[] di sini — sessionAction.tool, commands[].tool, dan bidang tool di dalam menus hanya diperiksa sebagai string yang tidak kosong pada waktu pemasangan; host tidak memverifikasi nama yang dideklarasikan di tools[], dan masih mengirimkan panggilan dengan nama tersebut ketika tombol, pintasan, atau item menu dipicu. Jadi tindakan yang murni dipicu oleh UI dapat ditangani sepenuhnya di index.js Anda sendiri tanpa pernah muncul di tools[] — tetapi AI tidak akan pernah bisa melihat atau memanggilnya. Jika Anda ingin tindakan yang sama dapat dipicu dengan mengklik dan oleh AI yang bertindak atas permintaan obrolan, nyatakan juga nama yang sama di tools[], sehingga kedua titik masuk berbagi satu penangan; jika tujuannya hanya untuk UI saja, biarkan tidak dideklarasikan — tidak perlu menambahkan entri hanya agar terlihat lengkap.Protokol pesan
Tuan rumah mengirimkan call_tool; plugin harus membalas dengan tool_result atau tool_error dengan requestId yang sama. Panggilan tanpa balasan dalam waktu 30 detik akan habis dan model menerima kesalahan.
content hanya menerima blok text dan image (gambar sebagai base64 data plus mimeType); tipe lain dihilangkan. details adalah data terstruktur arbitrer yang tidak pernah dimasukkan ke model; ini untuk rendering UI host dan tampilan dok Anda sendiri.
Hasil file: kartu file
Rendering daftar periksa: daftar periksa renderAs
Menulis deskripsi yang bagus
Jelaskan pemicu dalam perintah ("Panggil ini ketika pengguna meminta untuk...") dan nyatakan pengecualian ("Jangan panggil ini untuk..."). Jika hasilnya berupa file, mintalah model untuk mereferensikan link file yang dikembalikan daripada mengklaim bahwa file tersebut telah dibuat. Jika argumen diteruskan ke API generasi eksternal, sebutkan bahasa apa yang seharusnya digunakan. Hindari satu kalimat seperti "kelola tugas"; model tidak akan tahu kapan harus menggunakan alat tersebut.
06Tampilan berlabuh (tampilan)
Tampilan berlabuh adalah halaman tetap di sidebar kanan sesi: ikon tambahan muncul di toolbar sesi dan HTML Anda ditampilkan di sebelah kanan saat dibuka. Status halaman (posisi gulir, draf) bertahan dalam sesi peralihan dan diciutkan/diperluas, semantik yang sama seperti tampilan sidebar VS Code.
| Bidang | Keterangan |
|---|---|
id | Unik dalam plugin. |
title | Teks keterangan alat untuk ikon (dapat dibaca manusia). |
icon | Pilih dari daftar host yang diizinkan: git-branch, checklist. Menjaga konsistensi ikon di seluruh aplikasi; gambar khusus tidak diterima. |
entry | File HTML, relatif terhadap folder plugin. |
width | Lebar panel default opsional dalam piksel, 240 hingga 640, default 360. Pengguna dapat menyeret untuk mengubah ukuran dan ukurannya diingat. |
Waktu proses halaman
Halaman berjalan di kotak pasir (sandbox + contextIsolation, tanpa Node, tidak ada akses ke data aplikasi host) dan hanya dapat berkomunikasi dengan proses pluginnya sendiri melalui beberapa metode di window.pluginHost. Bawalah gaya Anda sendiri; disarankan untuk mengikuti skema terang/gelap aplikasi seperti pada contoh di bawah ini.
Pola yang direkomendasikan: pada pemuatan pertama, panggil salah satu alat kueri Anda dengan invoke() dan minta alat tersebut mengembalikan data terstruktur di details; setelah itu dorong setiap perubahan dari proses plugin dengan ui_push alih-alih melakukan polling. Saat AI mengubah data dalam percakapan, panel segera disegarkan.
07Panel mengambang (ui)
ui: { entry, title } mendeklarasikan jendela mengambang mandiri (900×700) yang dibuka pengguna dari menu "⋯" di daftar plugin; itu hancur dalam waktu dekat. Lingkungan halaman dan window.pluginHost API identik dengan tampilan yang digandeng, dan ui_push dikirimkan ke panel mengambang dan tampilan yang digandeng. Cocok untuk panel besar yang dibuka sesekali; gunakan views untuk konten yang harus tetap ada di samping sesi.
08Ikon toolbar sesi (sessionAction)
Maksimal satu ikon persisten per plugin. Mengkliknya akan memanggil tool dengan argumen kosong, sehingga alat tersebut harus melakukan sesuatu yang berarti tanpa parameter.
| Bidang | Keterangan |
|---|---|
tool | Alat untuk menelepon saat diklik. |
icon | Nama ikon yang diizinkan. |
tooltip | Arahkan teks. |
visibleTool | Opsional. Jika disetel, ikon akan dipanggil dengan argumen kosong sebelum dirender dan boolean details.visible pada hasilnya menentukan apakah ikon akan ditampilkan. Berguna untuk pemeriksaan runtime seperti "apakah folder saat ini merupakan repositori git". |
09Pengaturan (konfigurasi)
Entri yang dideklarasikan muncul di bawah konfigurasi plugin pada halaman pengaturan. Host menyimpan nilai yang diubah oleh pengguna dan meneruskannya sebagai context.config pada setiap call_tool (dikunci oleh id, kembali ke defaultValue), baik panggilan tersebut berasal dari AI, ikon toolbar, atau panel Anda. Anda tidak perlu memintanya.
| type | Diterjemahkan sebagai | tipe nilai default |
|---|---|---|
select | Daftar pilihan tunggal; opsi berasal dari optionsTool | string |
boolean | Sakelar sakelar | boolean |
string | Input teks, dilakukan pada blur | string |
number | Masukan angka | number |
10Palet perintah/pintasan/menu konteks
Ketiganya merupakan titik masuk yang berbeda untuk "memanggil alat dengan argumen kosong"; sebuah plugin dapat mendeklarasikan beberapa.
| Bidang | Membentuk | Keterangan |
|---|---|---|
commands | { tool, icon, title }[] | Ditampilkan di palet perintah Ctrl/Cmd+K dan dipicu setelah pengguna mencarinya. |
keybindings | { command, key }[] | command harus sama dengan tool entri di commands[]. key menggunakan notasi mod+shift+g, dengan mod adalah Cmd di macOS dan Ctrl di tempat lain. Konflik dengan pintasan lain tidak diperiksa secara statis, jadi pilihlah kombinasi yang tidak umum. |
menus | { "session/context": { tool, icon, title }[] } | Ditambahkan ke menu pada baris sesi. Hanya lokasi ini yang tersedia untuk saat ini. |
11Pengurai dokumen (documentParsers)
Saat pengguna memasukkan file ke dalam kotak input, host mencari parser yang dideklarasikan oleh plugin yang diaktifkan berdasarkan tipe MIME dan meneruskan konten file sebagai base64 ke toolName yang cocok. Ini bukan alat yang dipanggil oleh AI, jadi jangan not cantumkan juga alat parser di bawah tools, atau alat tersebut akan ditampilkan sebagai alat yang dapat dipanggil oleh AI.
12Membalikkan RPC (host_request)
Proses plugin tidak memiliki Electron API. Ketika memerlukan kemampuan sistem nyata, ia mengirimkan host_request ke host, yang membalas dengan host_response atau host_error. Saluran ini sepenuhnya independen dari call_tool; Anda dapat menggunakannya saat menangani panggilan alat atau dari pengatur waktu.
| capability | params | result | Prasyarat |
|---|---|---|---|
show_notification | { title, body?, viewId? } | { shown: true } / { shown: false, reason: "disabled" | "unsupported" } | Membutuhkan izin notifications. Pengembalian dinonaktifkan alih-alih kesalahan saat pengguna mematikan notifikasi desktop di pengaturan. Saat viewId menunjuk ke salah satu tampilan yang digandeng, mengeklik notifikasi akan membawa aplikasi ke depan dan memperluas tampilan tersebut. |
render_pdf | { outputPath, title, content } | {} | konten adalah penurunan harga; tuan rumah merender PDF ke outputPath dengan penyaji bawaannya. |
13Siklus hidup
| Panggung | Perilaku |
|---|---|
| Awal | Malas secara default: tidak dimulai dengan aplikasi, bercabang pada panggilan pertama ke salah satu alat Anda (AI, ikon toolbar, panel, perintah, penguraian dokumen). Plugin yang menyatakan activationEvents: ["onStartupFinished"] dimulai tepat setelah aplikasi selesai diluncurkan; gunakan ini hanya untuk plugin yang memerlukan pengatur waktu latar belakang (pengingat, polling), bukan untuk plugin alat biasa. |
| Penduduk | Setelah dimulai, prosesnya tetap berjalan dan digunakan kembali di seluruh panggilan alat. Anda dapat menyimpan status dalam cache di memori, tetapi menganggapnya dapat dimulai ulang kapan saja. |
| Menabrak | Jika proses keluar secara tiba-tiba, host akan memulai ulang: segera, kemudian setelah 5 dan 15 detik. Setelah 3 kegagalan berturut-turut, ini ditandai "gagal" dan tidak lagi dicoba ulang; pengguna melihat status di halaman plugin. Panggilan dalam penerbangan semua kesalahan pengembalian. |
| Nonaktifkan / uninstall / instal ulang | Proses dihentikan dan tampilan yang digandeng serta panel mengambang dihancurkan; instalasi ulang menggantikan seluruh folder. |
| Log | stdout/stderr Anda ditulis ke file log aplikasi yang diawali dengan id plugin. Biasa console.log sudah cukup untuk debugging; lihat "Debug & FAQ". |
ELECTRON_RUN_AS_NODE=1, cwd adalah folder pemasangan plugin, dan versi Node cocok dengan Electron yang dibundel dengan aplikasi. Jangan bergantung pada paket apa pun yang diinstal secara global dan jangan berasumsi npx ada.14Pengemasan & Penerbitan
Kemasan
Zip folder plugin dengan manifest.json di root arsip. Jika Anda memiliki dependensi pihak ketiga, gabungkan dependensi tersebut ke dalam satu file dengan esbuild/webpack terlebih dahulu alih-alih mengirimkan keseluruhan node_modules.
Penerbitan ke pasar
AnBoWork → Alat → Plugin → tab "Marketplace" → "Publikasikan plugin" di pojok kanan atas, lalu unggah zipnya. Kiriman masuk ke tinjauan, yang memeriksa apakah deklarasi manifes cocok dengan kode (terutama izin). Setelah disetujui, pengguna lain dapat menemukan dan menginstalnya di pasar, dan AI dapat menginstal plugin terverifikasi untuk pengguna secara otomatis saat dianggap diperlukan.
Pembaruan
Bump version dan publikasikan lagi. Aplikasi ini membandingkan versi yang diinstal dengan versi pasar dan meminta untuk memperbarui; menginstal ulang mempertahankan status aktif dan nilai pengaturan pengguna.
15Contoh lengkap: Todo Quadrant
Plugin yang nyata dan berfungsi (dipangkas): AI dapat menambah dan menghapus tugas, sidebar kanan menampilkan papan yang disegarkan secara real time, dan dapat mengirimkan pengingat notifikasi sistem. Merangkai ketiganya mencakup protokol alat, dorongan tampilan dok, dan RPC terbalik.
16Proses Debug & FAQ
| Gejala | Penyebab dan perbaikan |
|---|---|
| Validasi manifes gagal saat instalasi | Periksa setiap bidang terhadap tabel "Bidang Manifes" seperti yang ditunjukkan oleh pesan: format id, utama/entri tidak boleh berisi .., ikon harus diizinkan, perintah pengikatan kunci harus menunjuk ke alat yang ada dalam perintah, lebar antara 240 dan 640. |
| AI tidak pernah memanggil alat saya | Hampir selalu ada masalah description: pemicunya tidak jelas atau tidak ditulis dalam bahasa Inggris. Lihat "Menulis deskripsi yang baik". Periksa juga apakah nama alat tidak bertabrakan dengan alat lain. |
| Waktu panggilan habis (30 detik) | Skrip entri tidak membalas dengan tool_result. Biasanya requestId tidak di-echo kembali, pesan type salah eja, atau skrip terlempar saat startup dan keluar. Cari baris yang diawali dengan [plugin:your-id] di log aplikasi. |
| Status plugin menunjukkan "rusak" | 3 start gagal berturut-turut. Biasanya require dari paket yang hilang; menjalankan node index.js di folder plugin akan mereproduksinya. Setelah diperbaiki, matikan dan hidupkan lagi plugin di halaman plugin. |
| Panel terbuka kosong | Jalur entry salah, atau kesalahan JS pada halaman. Halaman berjalan di kotak pasir tanpa require Node; hanya window.pluginHost yang tersedia. |
| Notifikasi tidak muncul | Periksa secara berurutan: manifes menyatakan notifications; hasilnya bukan shown:false (pengguna mematikan notifikasi desktop); OS mengizinkan notifikasi dari AnBoWork. |
| Nilai pengaturan tidak dapat dibaca | Nilai ada di message.context.config[id], bukan di params. |
Lokasi berkas log
| sistem operasi | Jalur |
|---|---|
| macOS | ~/Library/Logs/AnBoWork/main.log |
| Windows | %USERPROFILE%\AppData\Roaming\AnBoWork\logs\main.log |