Dokumentacja programisty wtyczek
Twórz wtyczki do aplikacji komputerowej AnBoWork: dodawaj nowe narzędzia dla sztucznej inteligencji, dokuj własny panel obok sesji, wysyłaj powiadomienia systemowe, analizuj nowe formaty plików. Na początek wystarczy jeden manifest.json i jeden skrypt wejściowy.
01Przegląd
Wtyczka AnBoWork to zwykły program Node.js. Po instalacji aplikacja przekształca ją w samodzielny proces potomny (czysty węzeł, bez interfejsu Electron API) i komunikuje się z nim za pośrednictwem komunikatów między procesami. Nie jest wymagany żaden pakiet SDK; wszystko czego potrzebujesz to process.on('message') i process.send().
Wszystko, co może zrobić wtyczka, jest zadeklarowane statycznie w manifest.json: strona zgody przed instalacją i przegląd na rynku mogą określić, jakie narzędzia dodaje i jakich uprawnień potrzebuje, bez uruchamiania żadnego kodu wtyczki. Cały interfejs użytkownika (ikony na pasku narzędzi, ustawienia, paleta poleceń, menu kontekstowe) jest renderowany przez hosta na podstawie deklaracji; kod wtyczki nigdy nie działa w głównym oknie. Tylko zadokowane widoki i pływające panele są Twoim własnym kodem HTML i działają na izolowanych stronach w trybie piaskownicy.
Możliwości w skrócie
| Pole manifestu | Zdolność | Gdzie użytkownicy to widzą |
|---|---|---|
tools | Dodaj wywoływalne narzędzia dla sztucznej inteligencji | AI wywołuje je automatycznie w trakcie rozmowy; wywołania narzędzi są wyświetlane w sesji |
views | Widok stały zadokowany na prawym pasku bocznym sesji | Dodatkowa ikona na pasku narzędzi sesji otwiera Twoją stronę po prawej stronie |
ui | Samodzielne pływające okno | Otwierane z menu „⋯” na liście wtyczek |
sessionAction | Ikona trwałej akcji na pasku narzędzi sesji | Jedno kliknięcie uruchamia określone narzędzie |
configuration | Wpisy na stronie ustawień | Ustawienia → Konfiguracja wtyczki; wartości są przekazywane przy każdym wywołaniu |
commands | Wpisy palety poleceń Ctrl/Cmd+K | Paleta poleceń |
keybindings | Globalne skróty klawiaturowe | Kombinacja klawiszy uruchamia polecenie |
menus | Elementy menu kontekstowego sesji | Menu „⋯” / kliknięcie prawym przyciskiem myszy w wierszu sesji |
documentParsers | Analizuj pliki upuszczone do pola wejściowego | Wywoływane automatycznie, gdy użytkownik upuści pasujący plik |
activationEvents | Zacznij razem z aplikacją | Niewidzialny; dla wtyczek, które wymagają liczników czasu w tle |
permissions | Zadeklaruj wymagane uprawnienia | Strona zgody przed instalacją |
02Szybki start
Minimalna wtyczka potrzebuje tylko dwóch plików.
1. Napisz manifest.json
2. Napisz skrypt wejścia
3. Zainstaluj w aplikacji
Otwórz AnBoWork → górny pasek „Narzędzia” → „Wtyczki” → „Zainstaluj lokalnie” w prawym górnym rogu, a następnie wybierz folder wtyczek (lub jego plik zip). Strona zgody zawiera listę zadeklarowanych uprawnień i każdego narzędzia przed instalacją; potwierdź, aby włączyć.
4. Spróbuj
W dowolnej sesji powiedz AI „poproś wtyczkę, aby przywitała się z Alicją”. Na podstawie opisu narzędzia AI decyduje się wywołać say_hello, a wywołanie i jego wynik pojawiają się w sesji.
03Pola manifestu
| Pole | Typ | Wymagany | Opis |
|---|---|---|---|
id | string | Tak | Styl domeny odwrotnej, np. com.example.my-plugin. Tylko litery, cyfry, kropki i łączniki. Niezmienny po utworzeniu; ponowna instalacja tego samego identyfikatora jest traktowana jako ponowna instalacja. |
name | string | Tak | Nazwa wtyczki. Razem z description jest on podawany do modelu jako kontekst, dlatego zalecany jest język angielski. |
version | string | Tak | Wersja semantyczna; rynek używa go do wykrywania aktualizacji. |
description | string | Tak | Jedno zdanie opisujące działanie wtyczki (w języku angielskim). |
author | string | NIE | Autor. |
readme | string | NIE | Długi opis wyświetlany na stronie szczegółów rynku obsługuje Markdown. Obrazy w nim muszą mieć adresy URL https — ścieżki względne do plików spakowanych w pliku zip nie są obsługiwane. |
icon | string | NIE | Ikona wyświetlana na liście rynku i stronie szczegółów — ścieżka względna do pliku spakowanego w pliku ZIP (np. icon.png). Musi być w formacie PNG, a nie SVG, co najmniej 128 × 128. |
main | string | Tak | Skrypt wejściowy względem folderu wtyczki. .. ucieczka z folderu jest niedozwolona. |
permissions | string[] | Tak | network / filesystem / notifications; może być pustą tablicą. Zobacz „Model uprawnień”. |
tools | object[] | Tak | Deklaracje narzędzi; może być pustą tablicą. Patrz „Narzędzia i protokół połączeń”. |
documentParsers | object[] | NIE | Możliwość analizowania plików. |
ui | object | NIE | Pływający panel:{ entry, title } |
views | object[] | NIE | Zadokowane widoki:{ id, title, icon, entry, width? } |
sessionAction | object | NIE | Ikona paska narzędzi, maksymalnie jedna na wtyczkę. |
configuration | object[] | NIE | Lista wpisów ustawień. |
commands | object[] | NIE | Wpisy palety poleceń. |
keybindings | object[] | NIE | Skróty. command musi odwoływać się do tool wpisu w commands[], w przeciwnym razie instalacja zostanie odrzucona. |
menus | object | NIE | Na razie dostępna jest tylko lokalizacja session/context. |
activationEvents | string[] | NIE | Na razie tylko onStartupFinished. |
Konwencje językowe tekstu
Tekst w manifeście ma dwóch odbiorców. Dla modelu: name, description, tools[].description, tools[].parameters.*.description. Napisz je po angielsku; modele lepiej rozumieją angielskie opisy narzędzi i parametry wypełnienia. Dla osób: tools[].summary (jednowierszowe podsumowanie na stronie zgody), ui.title, views[].title, sessionAction.tooltip, configuration[].label, commands[].title i title wewnątrz menus. Zapisz je w języku docelowych użytkowników.
04Model uprawnień
permissions musi szczerze odzwierciedlać to, co faktycznie robi kod. Strona zgody na instalację przed instalacją zawiera listę poszczególnych z nich, dzięki czemu użytkownicy mogą zdecydować, czy dokonać instalacji; Przegląd rynku sprawdza również deklarację pod kątem zgodności z kodem.
| Pozwolenie | Kiedy trzeba to zgłosić | Jak gospodarz to traktuje |
|---|---|---|
filesystem | Odczyt lub zapis plików użytkownika (odczyt kodu projektu, generowanie dokumentów, przechowywanie danych w folderze domowym) | Świadoma zgoda pokazana użytkownikowi. |
network | Wykonywanie dowolnego żądania sieciowego (interfejsy API stron trzecich, pliki do pobrania) | Świadoma zgoda pokazana użytkownikowi. |
notifications | Wyświetlanie powiadomień systemowych poprzez odwrotne wywołanie RPC show_notification | Enforced: wywołanie bez deklaracji zwraca host_error i nie jest wyświetlane żadne powiadomienie. |
filesystem i network są obecnie deklaracjami na poziomie zgody, a nie piaskownicą środowiska wykonawczego: host nie przechwytuje fs ani fetch. Właśnie dlatego deklaracje muszą być szczere. Wtyczki, które nie deklarują, są odrzucane podczas przeglądu na rynku i tracą zaufanie użytkowników po wykryciu. Nie deklaruj też przesadnie (niewykorzystane uprawnienia powodują, że użytkownicy się wahają).Prywatność i dane
context.cwd to folder projektu użytkownika i może zawierać kod źródłowy i poufną konfigurację; Argumenty narzędzia mogą zawierać rozmowę użytkownika. Nie wysyłaj tych danych przez sieć, chyba że funkcja tego wymaga, a kiedy to zrobisz, wpisz w description i summary, co jest wysyłane i do kogo. Przechowuj trwałe dane wtyczki w pliku w folderze domowym użytkownika, którego nazwa pochodzi od identyfikatora wtyczki, aby można je było łatwo znaleźć podczas odinstalowywania.
05Narzędzia i protokół połączeń
Deklaracja
| Pole | Opis |
|---|---|
name | Nazwa narzędzia pisana małymi literami i podkreśleniami, unikalna w całej aplikacji (jest zarejestrowana w modelu wraz z narzędziami wbudowanymi i narzędziami innych wtyczek). |
description | Opis modelu (w języku angielskim). Podaj trzy rzeczy: co robi narzędzie, co mówi użytkownik, kiedy należy je wywołać i kiedy nie należy go wywoływać. Jest to najważniejsze pole określające, czy sztuczna inteligencja korzysta z Twojej wtyczki. |
summary | Jednowierszowe podsumowanie czytelne dla człowieka wyświetlane na stronie zgody. Opcjonalne, ale zdecydowanie zalecane; w przeciwnym razie zamiast tego wyświetlany jest skrócony opis. |
parameters | Standardowy obiekt schematu JSON z wartością description w każdej właściwości. Model wypełnia z niego argumenty, a host przekazuje je bez dodatkowej weryfikacji, więc sprawdź wymagane pola w swoim kodzie. |
renderAs | Fakultatywny; obecnie tylko checklist: host renderuje tablicę todos z argumentów wywołania jako kartę listy kontrolnej, patrz poniżej. |
tools[] tutaj — sessionAction.tool, commands[].tool, a pole tool wewnątrz menus są sprawdzane tylko pod kątem niepustych ciągów znaków podczas instalacji; host nie sprawdza, czy nazwa została zadeklarowana w tools[] i nadal wywołuje wywołanie pod tą nazwą, gdy zostanie uruchomiony przycisk, skrót lub element menu. Zatem czynność uruchamianą wyłącznie przez interfejs użytkownika można wykonać w całości w index.js, nie pojawiając się w tools[] — ale wtedy sztuczna inteligencja nigdy jej nie zobaczy ani nie wywoła. Jeśli chcesz, aby ta sama akcja była uruchamiana zarówno przez kliknięcie, jak i przez sztuczną inteligencję działającą na żądanie czatu, zadeklaruj tę samą nazwę również w tools[], aby oba punkty wejścia miały ten sam moduł obsługi; jeśli ma on pozostać wyłącznie interfejsem użytkownika, pozostaw go niezadeklarowanym — nie ma potrzeby dodawania wpisu, aby wyglądał na kompletny.Protokół wiadomości
Host wysyła call_tool; wtyczka musi odpowiedzieć tool_result lub tool_error niosąc to samo requestId. Połączenie bez odpowiedzi w ciągu 30 sekund upłynie i model otrzyma błąd.
content akceptuje tylko bloki text i image (obraz jako base64 data plus mimeType); inne typy są odrzucane. details to dane o dowolnej strukturze, które nigdy nie są wprowadzane do modelu; służy do renderowania interfejsu użytkownika hosta i własnych zadokowanych widoków.
Wyniki plików: karty plików
Renderowanie listy kontrolnej: lista kontrolna renderAs
Napisanie dobrego opisu
Opisz wyzwalacz w trybie rozkazującym („Wywołaj to, gdy użytkownik poprosi o…”) i określ wykluczenia („Nie wywoływaj tego dla…”). Jeśli wynikiem jest plik, poproś model, aby odwołał się do zwróconego łącza do pliku, zamiast twierdzić, że zostało ono wygenerowane. Jeśli argumenty są przekazywane do zewnętrznego interfejsu API generacji, powiedz, w jakim języku powinny być zapisane. Unikaj jednowierszowych sformułowań, takich jak „zarządzaj zadaniami”; model nie będzie wiedział, kiedy użyć narzędzia.
06Widoki zadokowane (widoki)
Widok zadokowany to trwała strona na prawym pasku bocznym sesji: na pasku narzędzi sesji pojawia się dodatkowa ikona, a po otwarciu kod HTML jest wyświetlany po prawej stronie. Stan strony (pozycja przewijania, wersje robocze) przetrwa sesje przełączania i zwijanie/rozwijanie, taka sama semantyka jak widok paska bocznego VS Code.
| Pole | Opis |
|---|---|
id | Unikalny w wtyczce. |
title | Tekst podpowiedzi ikony (czytelny dla człowieka). |
icon | Wybierz z listy dozwolonych gospodarzy: git-branch, checklist. Zapewnia spójność ikon w całej aplikacji; niestandardowe obrazy nie są akceptowane. |
entry | Plik HTML względem folderu wtyczki. |
width | Opcjonalna domyślna szerokość panelu w pikselach, od 240 do 640, domyślna 360. Użytkownicy mogą przeciągać, aby zmienić rozmiar, a rozmiar zostanie zapamiętany. |
Czas działania strony
Strona działa w piaskownicy (sandbox + contextIsolation, brak węzła, brak dostępu do danych aplikacji hosta) i może komunikować się z własnym procesem wtyczki tylko za pomocą kilku metod na window.pluginHost. Przynieś swój własny styl; Zalecane jest przestrzeganie schematu jasny/ciemny aplikacji, jak w przykładzie poniżej.
Zalecany wzorzec: przy pierwszym ładowaniu wywołaj jedno z własnych narzędzi zapytań za pomocą invoke() i poproś o zwrócenie uporządkowanych danych w details; następnie wypchnij każdą zmianę z procesu wtyczki za pomocą ui_push zamiast odpytywania. Gdy AI zmieni dane w rozmowie, panel natychmiast się odświeża.
07Pływający panel (UI)
ui: { entry, title } deklaruje samodzielne pływające okno (900×700), które użytkownicy otwierają z menu „⋯” na liście wtyczek; zostaje zniszczony po zamknięciu. Środowisko strony i interfejs API window.pluginHost są identyczne z widokami zadokowanymi, a ui_push jest dostarczane zarówno do panelu pływającego, jak i do widoków zadokowanych. Nadaje się do dużych paneli otwieranych sporadycznie; użyj views dla treści, które powinny pozostać obok sesji.
08Ikona paska narzędzi sesji (sessionAction)
Maksymalnie jedna trwała ikona na wtyczkę. Kliknięcie wywołuje tool z pustymi argumentami, więc narzędzie musi zrobić coś znaczącego bez parametrów.
| Pole | Opis |
|---|---|
tool | Narzędzie do wywoływania po kliknięciu. |
icon | Nazwa ikony na liście dozwolonych. |
tooltip | Najedź kursorem na tekst. |
visibleTool | Fakultatywny. Gdy jest ustawiona, jest wywoływana z pustymi argumentami przed renderowaniem, a wartość logiczna details.visible w wyniku decyduje, czy ikona się pojawi. Przydatne do sprawdzania w czasie wykonywania, np. „czy bieżący folder jest repozytorium git”. |
09Ustawienia (konfiguracja)
Zadeklarowane wpisy pojawiają się w konfiguracji wtyczki na stronie ustawień. Host przechowuje wartości zmienione przez użytkownika i przekazuje je jako context.config co call_tool (z kluczem id, z powrotem do defaultValue), niezależnie od tego, czy połączenie pochodzi z AI, ikony na pasku narzędzi czy z panelu. Nigdy nie musisz o nie prosić.
| type | Renderowane jako | typ wartości domyślnej |
|---|---|---|
select | Lista jednokrotnego wyboru; opcje pochodzą z optionsTool | string |
boolean | Przełącznik | boolean |
string | Wprowadzanie tekstu, popełnione przy rozmyciu | string |
number | Wprowadzanie numeru | number |
10Paleta poleceń / skróty / menu kontekstowe
Wszystkie trzy to różne punkty wejścia dla „wywołania narzędzia z pustymi argumentami”; wtyczka może zadeklarować kilka.
| Pole | Kształt | Opis |
|---|---|---|
commands | { tool, icon, title }[] | Wyświetlany na palecie poleceń Ctrl/Cmd+K i wywoływany po wyszukaniu go przez użytkownika. |
keybindings | { command, key }[] | command musi być równe tool wpisu w commands[]. key używa notacji mod+shift+g, gdzie mod to Cmd na macOS i Ctrl gdzie indziej. Konflikty z innymi skrótami nie są sprawdzane statycznie, więc wybieraj nietypowe kombinacje. |
menus | { "session/context": { tool, icon, title }[] } | Dodano do menu w wierszu sesji. Na razie dostępna jest tylko ta lokalizacja. |
11Parsery dokumentów (documentParsers)
Gdy użytkownik upuści plik w polu wejściowym, host wyszukuje parsery zadeklarowane przez włączone wtyczki według typu MIME i przekazuje zawartość pliku jako base64 do pasującego toolName. Nie jest to narzędzie, które sztuczna inteligencja zdecyduje się wywołać, dlatego nie wypisz także narzędzie parsera pod tools, w przeciwnym razie zostanie ono ujawnione jako narzędzie wywoływane przez sztuczną inteligencję.
12Odwrotne wywołanie RPC (host_request)
Proces wtyczki nie ma interfejsu API Electron. Kiedy potrzebuje rzeczywistych możliwości systemu, wysyła host_request do hosta, który odpowiada host_response lub host_error. Kanał ten jest w pełni niezależny od call_tool; można go używać podczas obsługi wywołania narzędzia lub z poziomu licznika czasu.
| capability | params | result | Warunek wstępny |
|---|---|---|---|
show_notification | { title, body?, viewId? } | { shown: true } / { shown: false, reason: "disabled" | "unsupported" } | Wymaga pozwolenia notifications. Zwraca wyłączone zamiast błędu, gdy użytkownik wyłączył powiadomienia na pulpicie w ustawieniach. Kiedy viewId wskazuje jeden z zadokowanych widoków, kliknięcie powiadomienia przenosi aplikację na pierwszy plan i rozwija ten widok. |
render_pdf | { outputPath, title, content } | {} | treść to Markdown; host renderuje plik PDF do OutputPath za pomocą wbudowanego modułu renderującego. |
13Cykl życia
| Scena | Zachowanie |
|---|---|
| Start | Domyślnie leniwy: nie uruchomiony z aplikacją, rozwidlony przy pierwszym wywołaniu jednego z narzędzi (AI, ikona paska narzędzi, panel, polecenie, analiza dokumentu). Wtyczki deklarujące activationEvents: ["onStartupFinished"] uruchamiają się zaraz po zakończeniu uruchamiania aplikacji; używaj tego tylko do wtyczek, które wymagają liczników czasu w tle (przypomnienia, odpytywanie), a nie do zwykłych wtyczek narzędziowych. |
| Rezydent | Raz uruchomiony proces pozostaje aktywny i jest ponownie wykorzystywany w wywołaniach narzędzi. Możesz buforować stan w pamięci, ale załóż, że można go zrestartować w dowolnym momencie. |
| Rozbić się | Jeśli proces zakończy się nieoczekiwanie, host uruchomi go ponownie: natychmiast, a następnie po 5 i 15 sekundach. Po 3 kolejnych niepowodzeniach zostaje oznaczony jako „awaria” i nie jest już ponawiany; użytkownicy widzą status na stronie wtyczki. Wszystkie wywołania podczas lotu zwracają błędy. |
| Wyłącz / odinstaluj / zainstaluj ponownie | Proces zostaje zakończony, a zadokowane widoki i pływające panele zostają zniszczone; ponowna instalacja zastępuje cały folder. |
| Dzienniki | Twoje stdout/stderr są zapisywane w pliku dziennika aplikacji poprzedzonym identyfikatorem wtyczki. Do debugowania wystarczy zwykły console.log; zobacz „Debugowanie i często zadawane pytania”. |
ELECTRON_RUN_AS_NODE=1, cwd to folder instalacyjny wtyczki, a wersja Node odpowiada wersji Electron dołączonej do aplikacji. Nie polegaj na żadnym globalnie zainstalowanym pakiecie i nie zakładaj, że npx istnieje.14Pakowanie i wydawnictwo
Opakowanie
Spakuj folder wtyczki z manifest.json w katalogu głównym archiwum. Jeśli masz zależności od stron trzecich, spakuj je w jeden plik za pomocą najpierw esbuild/webpack, zamiast wysyłać cały node_modules.
Publikowanie na rynku
AnBoWork → Narzędzia → Wtyczki → zakładka „Rynek” → „Opublikuj wtyczkę” w prawym górnym rogu, a następnie prześlij plik ZIP. Zgłoszenia podlegają przeglądowi, który sprawdza, czy deklaracja manifestu jest zgodna z kodem (szczególnie uprawnienia). Po zatwierdzeniu inni użytkownicy mogą znaleźć i zainstalować ją na rynku, a sztuczna inteligencja może automatycznie instalować zweryfikowane wtyczki dla użytkowników, gdy uzna je za potrzebne.
Aktualizacje
Podbij version i opublikuj ponownie. Aplikacja porównuje zainstalowaną wersję z wersją z marketu i wyświetla monit o aktualizację; ponowna instalacja powoduje zachowanie stanu włączenia i wartości ustawień użytkownika.
15Pełny przykład: Kwadrant zadań do wykonania
Prawdziwa, działająca wtyczka (przycięta): sztuczna inteligencja może dodawać i usuwać zadania, na prawym pasku bocznym wyświetla się tablica, która odświeża się w czasie rzeczywistym i może wysyłać przypomnienia o powiadomieniach systemowych. Łączenie tych trzech elementów obejmuje protokół narzędzia, wypychanie widoku zadokowanego i odwrotne wywołanie RPC.
16Debugowanie i często zadawane pytania
| Objaw | Przyczyna i naprawa |
|---|---|
| Podczas instalacji nie udaje się sprawdzić poprawności manifestu | Sprawdź każde pole w tabeli „Pola manifestu”, zgodnie z komunikatem: format identyfikatora, element główny/wpis nie może zawierać .., ikona musi znajdować się na liście dozwolonych, polecenie skrótów klawiszowych musi wskazywać istniejące narzędzie w poleceniach, szerokość między 240 a 640. |
| AI nigdy nie wywołuje mojego narzędzia | Prawie zawsze problem description: wyzwalacz jest niejasny lub nie jest napisany w języku angielskim. Zobacz „Pisanie dobrego opisu”. Sprawdź także, czy nazwa narzędzia nie koliduje z nazwą innego narzędzia. |
| Limit czasu połączenia (30 s) | Skrypt wejściowy nie odpowiedział tool_result. Zwykle requestId nie zostało powtórzone, komunikat type jest błędnie napisany lub skrypt rzucił się przy uruchomieniu i zakończył działanie. Poszukaj wierszy z przedrostkiem [plugin:your-id] w dzienniku aplikacji. |
| Stan wtyczki pokazuje „awaria” | 3 kolejne nieudane starty. Zwykle require brakującego pakietu; uruchomienie node index.js w folderze wtyczki odtwarza to. Po naprawieniu wyłącz i włącz wtyczkę na stronie wtyczki. |
| Panel otwiera się pusty | Zła ścieżka entry lub błąd JS na stronie. Strona działa w piaskownicy bez węzłów require; dostępne jest tylko window.pluginHost. |
| Powiadomienie nie pojawia się | Sprawdź w kolejności: manifest deklaruje notifications; wynikiem nie jest shown:false (użytkownik wyłączył powiadomienia na pulpicie); system operacyjny umożliwia powiadomienia z AnBoWork. |
| Wartości ustawień nie są czytelne | Wartości znajdują się w message.context.config[id], a nie w params. |
Lokalizacja pliku dziennika
| system operacyjny | Ścieżka |
|---|---|
| macOS | ~/Library/Logs/AnBoWork/main.log |
| Windows | %USERPROFILE%\AppData\Roaming\AnBoWork\logs\main.log |