Plugin-Entwicklerdokumente
Erstellen Sie Plugins für die AnBoWork Desktop-App: Fügen Sie neue Tools für die KI hinzu, docken Sie Ihr eigenes Panel neben einer Sitzung an, senden Sie Systembenachrichtigungen, analysieren Sie neue Dateiformate. Eine manifest.json plus ein Eingabeskript reichen aus, um loszulegen.
01Überblick
Ein AnBoWork-Plugin ist ein einfaches Node.js-Programm. Nach der Installation verzweigt die App ihn als eigenständigen untergeordneten Prozess (reiner Knoten, keine Electron-API) und kommuniziert mit ihm über prozessübergreifende Nachrichten. Es ist kein SDK-Paket erforderlich; Alles, was Sie brauchen, ist process.on('message') und process.send().
Alles, was ein Plugin tun kann, wird statisch in manifest.json deklariert: Die Zustimmungsseite vor der Installation und die Marktplatzüberprüfung können erkennen, welche Tools es hinzufügt und welche Berechtigungen es benötigt, ohne dass Plugin-Code ausgeführt werden muss. Die gesamte Benutzeroberfläche (Symbolleistensymbole, Einstellungen, Befehlspalette, Kontextmenüs) wird vom Host aus der Deklaration gerendert; Der Plugin-Code wird niemals im Hauptfenster ausgeführt. Nur angedockte Ansichten und schwebende Bedienfelder sind Ihr eigenes HTML und werden auf isolierten Sandbox-Seiten ausgeführt.
Fähigkeiten auf einen Blick
| Manifestfeld | Fähigkeit | Wo Benutzer es sehen |
|---|---|---|
tools | Fügen Sie aufrufbare Tools für die KI hinzu | Die KI ruft sie automatisch im Gespräch auf; Werkzeugaufrufe werden in der Sitzung angezeigt |
views | Permanente Ansicht, angedockt in der rechten Seitenleiste der Sitzung | Ein zusätzliches Symbol in der Sitzungssymbolleiste öffnet Ihre Seite auf der rechten Seite |
ui | Eigenständiges schwebendes Fenster | Wird über das Menü „⋯“ in der Plugin-Liste geöffnet |
sessionAction | Symbol für dauerhafte Aktion in der Sitzungssymbolleiste | Mit einem Klick wird das von Ihnen angegebene Tool ausgeführt |
configuration | Einträge auf der Einstellungsseite | Einstellungen → Plugin-Konfiguration; Bei jedem Aufruf werden Werte übergeben |
commands | Einträge in der Befehlspalette „Strg/Befehl+K“. | Befehlspalette |
keybindings | Globale Tastaturkürzel | Eine Tastenkombination löst einen Befehl aus |
menus | Elemente des Sitzungskontextmenüs | Das „⋯“ / Rechtsklick-Menü in einer Sitzungszeile |
documentParsers | Parse-Dateien werden im Eingabefeld abgelegt | Wird automatisch aufgerufen, wenn der Benutzer eine passende Datei ablegt |
activationEvents | Starten Sie gemeinsam mit der App | Unsichtbar; für Plugins, die Hintergrund-Timer benötigen |
permissions | Erklären Sie die erforderlichen Berechtigungen | Zustimmungsseite vor der Installation |
02Schnellstart
Ein minimales Plugin benötigt nur zwei Dateien.
1. Schreiben Sie manifest.json
2. Schreiben Sie das Eingabeskript
3. In die App installieren
Öffnen Sie AnBoWork → obere Leiste „Extras“ → „Plugins“ → „Lokal installieren“ in der oberen rechten Ecke und wählen Sie dann den Plugin-Ordner (oder eine ZIP-Datei davon) aus. Auf einer Zustimmungsseite werden die deklarierten Berechtigungen und jedes Tool vor der Installation aufgelistet. Zum Aktivieren bestätigen.
4. Probieren Sie es aus
Sagen Sie der KI in jeder Sitzung: „Bitten Sie das Plugin, Alice Hallo zu sagen“. Basierend auf der Toolbeschreibung entscheidet die KI, say_hello aufzurufen, und der Aufruf und sein Ergebnis erscheinen in der Sitzung.
03Manifestfelder
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id | string | Ja | Reverse-Domain-Stil, z.B. com.example.my-plugin. Nur Buchstaben, Ziffern, Punkte und Bindestriche. Unveränderlich, sobald es erstellt wurde; Eine erneute Installation derselben ID wird als Neuinstallation behandelt. |
name | string | Ja | Plugin-Name. Zusammen mit description wird es dem Modell als Kontext zugeführt, daher wird Englisch empfohlen. |
version | string | Ja | Semantische Version; Der Marktplatz nutzt es, um Updates zu erkennen. |
description | string | Ja | Ein Satz, der beschreibt, was das Plugin tut (Englisch). |
author | string | NEIN | Autor. |
readme | string | NEIN | Die ausführliche Beschreibung wird auf der Detailseite des Marktplatzes angezeigt und unterstützt Markdown. Darin enthaltene Bilder müssen https URLs sein – relative Pfade zu in der ZIP-Datei gebündelten Dateien werden nicht unterstützt. |
icon | string | NEIN | In der Marktplatzliste und auf der Detailseite angezeigtes Symbol – ein relativer Pfad zu einer in der ZIP-Datei gebündelten Datei (z. B. icon.png). Muss PNG sein, nicht SVG, mindestens 128×128. |
main | string | Ja | Eingabeskript, relativ zum Plugin-Ordner. .. Das Escapen des Ordners ist nicht zulässig. |
permissions | string[] | Ja | network / filesystem / notifications; kann ein leeres Array sein. Siehe „Berechtigungsmodell“. |
tools | object[] | Ja | Werkzeugdeklarationen; kann ein leeres Array sein. Siehe „Tools & Anrufprotokoll“. |
documentParsers | object[] | NEIN | Funktion zum Parsen von Dateien. |
ui | object | NEIN | Schwebendes Panel:{ entry, title } |
views | object[] | NEIN | Angedockte Ansichten:{ id, title, icon, entry, width? } |
sessionAction | object | NEIN | Symbolleistensymbol, höchstens eines pro Plugin. |
configuration | object[] | NEIN | Liste der Einstellungseinträge. |
commands | object[] | NEIN | Einträge in der Befehlspalette. |
keybindings | object[] | NEIN | Verknüpfungen. command muss auf die tool eines Eintrags in commands[] verweisen, andernfalls wird die Installation abgelehnt. |
menus | object | NEIN | Derzeit ist nur der Standort session/context verfügbar. |
activationEvents | string[] | NEIN | Vorerst nur onStartupFinished. |
Sprachkonventionen für Texte
Der Text im Manifest hat zwei Zielgruppen. Für das Modell: name, description, tools[].description, tools[].parameters.*.description. Schreiben Sie diese auf Englisch. Modelle verstehen englische Werkzeugbeschreibungen und füllen Parameter zuverlässiger aus. Für Personen: tools[].summary (einzeilige Zusammenfassung auf der Einwilligungsseite), ui.title, views[].title, sessionAction.tooltip, configuration[].label, commands[].title und title innerhalb von menus. Schreiben Sie diese in der Sprache Ihrer Zielbenutzer.
04Berechtigungsmodell
permissions muss ehrlich widerspiegeln, was der Code tatsächlich tut. Auf der Zustimmungsseite vor der Installation werden alle einzelnen Elemente aufgeführt, sodass Benutzer entscheiden können, ob sie installieren möchten. Die Marktplatzüberprüfung prüft außerdem die Deklaration anhand des Codes.
| Erlaubnis | Wann es deklariert werden muss | Wie der Gastgeber damit umgeht |
|---|---|---|
filesystem | Benutzerdateien lesen oder schreiben (Projektcode lesen, Dokumente erstellen, Daten im Home-Ordner speichern) | Einverständniserklärung, die dem Benutzer angezeigt wird. |
network | Stellen Sie beliebige Netzwerkanfragen (APIs von Drittanbietern, Downloads) | Einverständniserklärung, die dem Benutzer angezeigt wird. |
notifications | Systembenachrichtigungen über den show_notification Reverse RPC anzeigen | Erzwungen: Ein Aufruf ohne die Deklaration gibt host_error zurück und es wird keine Benachrichtigung angezeigt. |
filesystem und network sind derzeit Deklarationen auf Zustimmungsebene, keine Laufzeit-Sandbox: Der Host fängt fs oder fetch nicht ab. Genau deshalb müssen Erklärungen ehrlich sein. Plugins, die zu wenig deklariert sind, werden bei der Marktüberprüfung abgelehnt und verlieren das Vertrauen der Benutzer, wenn sie entdeckt werden. Deklarieren Sie auch nicht zu viel (nicht genutzte Berechtigungen lassen Benutzer zögern).Privatsphäre und Daten
context.cwd ist der Projektordner des Benutzers und kann Quellcode und vertrauliche Konfigurationen enthalten; Tool-Argumente können die Konversation des Benutzers enthalten. Senden Sie diese Daten nicht über das Netzwerk, es sei denn, die Funktion erfordert dies. Wenn Sie dies tun, geben Sie in description und summary an, was gesendet wird und an wen. Bewahren Sie die eigenen persistenten Daten des Plugins in einer Datei im Home-Ordner des Benutzers auf, die nach der Plugin-ID benannt ist, damit sie bei der Deinstallation leicht gefunden werden kann.
05Tools und Anrufprotokoll
Erklärung
| Feld | Beschreibung |
|---|---|
name | Werkzeugname in Kleinbuchstaben und Unterstrichen, eindeutig in der gesamten App (er wird zusammen mit integrierten Tools und anderen Plugin-Tools beim Modell registriert). |
description | Beschreibung für das Modell (Englisch). Geben Sie drei Dinge an: Was das Tool tut, was der Benutzer sagt, wann es aufgerufen werden soll und wann es nicht aufgerufen werden darf. Dies ist das wichtigste Feld dafür, ob die KI Ihr Plugin verwendet. |
summary | Einzeilige, für Menschen lesbare Zusammenfassung, die auf der Einwilligungsseite angezeigt wird. Optional, aber dringend empfohlen; andernfalls wird stattdessen eine verkürzte Beschreibung angezeigt. |
parameters | Standard-JSON-Schemaobjekt mit einer description für jede Eigenschaft. Das Modell füllt daraus Argumente und der Host leitet sie ohne zusätzliche Validierung weiter. Überprüfen Sie daher die erforderlichen Felder in Ihrem Code. |
renderAs | Optional; derzeit nur checklist: Der Host rendert das todos-Array aus den Aufrufargumenten als Checklistenkarte, siehe unten. |
tools[] deklarierte Werkzeugnamen aufrufen – sessionAction.tool, commands[].tool und das tool-Feld in menus werden bei der Installation nur darauf überprüft, dass es sich um nicht leere Zeichenfolgen handelt. Der Host überprüft nicht, ob der Name in tools[] deklariert ist, und sendet dennoch einen Anruf unter diesem Namen, wenn die Schaltfläche, die Verknüpfung oder das Menüelement ausgelöst wird. Eine rein UI-ausgelöste Aktion kann also vollständig in Ihrem eigenen index.js gehandhabt werden, ohne jemals in tools[] aufzutauchen – aber dann kann die KI sie nie sehen oder aufrufen. Wenn Sie möchten, dass dieselbe Aktion sowohl durch Klicken als auch durch die Reaktion der KI auf eine Chat-Anfrage ausgelöst werden kann, deklarieren Sie denselben Namen auch in tools[], sodass beide Einstiegspunkte einen Handler teilen; Wenn es nur für die Benutzeroberfläche gedacht ist, lassen Sie es nicht deklariert – es ist nicht nötig, einen Eintrag hinzuzufügen, nur um vollständig auszusehen.Nachrichtenprotokoll
Der Host sendet call_tool; Das Plugin muss mit einem tool_result oder tool_error antworten, das dasselbe requestId trägt. Bei einem Anruf ohne Antwort innerhalb von 30 Sekunden tritt eine Zeitüberschreitung auf und das Modell erhält einen Fehler.
content akzeptiert nur text- und image-Blöcke (Bild als Base64 data plus mimeType); andere Typen werden gelöscht. details sind willkürlich strukturierte Daten, die niemals dem Modell zugeführt werden; Es dient zum Rendern der Host-Benutzeroberfläche und Ihrer eigenen angedockten Ansichten.
Dateiergebnisse: Karteikarten
Checklisten-Rendering: renderAs-Checkliste
Eine gute Beschreibung schreiben
Beschreiben Sie den Auslöser im Imperativ („Rufen Sie dies auf, wenn der Benutzer darum bittet…“) und geben Sie Ausschlüsse an („Rufen Sie dies nicht auf für…“). Wenn das Ergebnis eine Datei ist, bitten Sie das Modell, auf den zurückgegebenen Dateilink zu verweisen, anstatt zu behaupten, dass er generiert wurde. Wenn Argumente an eine externe Generierungs-API weitergeleitet werden, geben Sie an, in welcher Sprache sie vorliegen sollen. Vermeiden Sie Einzeiler wie „Aufgaben verwalten“; Das Modell weiß nicht, wann es das Werkzeug verwenden soll.
06Angedockte Ansichten (Ansichten)
Eine angedockte Ansicht ist eine dauerhafte Seite in der rechten Seitenleiste der Sitzung: Ein zusätzliches Symbol erscheint in der Sitzungssymbolleiste und Ihr HTML wird beim Öffnen rechts angezeigt. Der Seitenstatus (Bildlaufposition, Entwürfe) überlebt den Sitzungswechsel und das Reduzieren/Erweitern, die gleiche Semantik wie eine VS Code-Seitenleistenansicht.
| Feld | Beschreibung |
|---|---|
id | Einzigartig innerhalb des Plugins. |
title | Tooltip-Text für das Symbol (für Menschen lesbar). |
icon | Wählen Sie aus der Host-Zulassungsliste: git-branch, checklist. Hält die Symbole in der gesamten App konsistent; Benutzerdefinierte Bilder werden nicht akzeptiert. |
entry | HTML-Datei, relativ zum Plugin-Ordner. |
width | Optionale Standardbreite des Panels in Pixeln, 240 bis 640, Standard 360. Benutzer können die Größe durch Ziehen ändern und die Größe wird gespeichert. |
Seitenlaufzeit
Die Seite läuft in einer Sandbox (sandbox + contextIsolation, kein Knoten, kein Zugriff auf Host-App-Daten) und kann nur über die wenigen Methoden auf window.pluginHost mit ihrem eigenen Plugin-Prozess kommunizieren. Bringen Sie Ihre eigenen Stile mit; Es wird empfohlen, dem Hell/Dunkel-Schema der App wie im folgenden Beispiel zu folgen.
Empfohlenes Muster: Rufen Sie beim ersten Laden eines Ihrer eigenen Abfragetools mit invoke() auf und lassen Sie es strukturierte Daten in details zurückgeben. Anschließend jede Änderung aus dem Plugin-Prozess mit ui_push pushen, statt abzufragen. Wenn die KI Daten in der Konversation ändert, wird das Panel sofort aktualisiert.
07Schwebendes Panel (UI)
ui: { entry, title } deklariert ein eigenständiges schwebendes Fenster (900×700), das Benutzer über das „⋯“-Menü in der Plugin-Liste öffnen; es wird beim Schließen zerstört. Die Seitenumgebung und die window.pluginHost-API sind identisch mit angedockten Ansichten, und ui_push wird sowohl für das schwebende Bedienfeld als auch für die angedockten Ansichten bereitgestellt. Geeignet für große Paneele, die gelegentlich geöffnet werden; Verwenden Sie views für Inhalte, die neben der Sitzung bleiben sollen.
08Sitzungssymbolleistensymbol (sessionAction)
Höchstens ein dauerhaftes Symbol pro Plugin. Wenn Sie darauf klicken, wird tool mit leeren Argumenten aufgerufen, sodass das Tool ohne Parameter etwas Sinnvolles tun muss.
| Feld | Beschreibung |
|---|---|
tool | Tool zum Aufrufen per Klick. |
icon | Symbolname auf der Zulassungsliste. |
tooltip | Hover-Text. |
visibleTool | Optional. Wenn es festgelegt ist, wird es vor dem Rendern mit leeren Argumenten aufgerufen und der boolesche Wert details.visible im Ergebnis entscheidet, ob das Symbol angezeigt wird. Nützlich für Laufzeitprüfungen wie „Ist der aktuelle Ordner ein Git-Repository“. |
09Einstellungen (Konfiguration)
Deklarierte Einträge erscheinen unter der Plugin-Konfiguration auf der Einstellungsseite. Der Host speichert vom Benutzer geänderte Werte und übergibt sie bei jedem call_tool als context.config (geschlüsselt durch id, Rückfall auf defaultValue), unabhängig davon, ob der Anruf von der KI, dem Symbolleistensymbol oder Ihrem Panel kommt. Sie müssen nie danach fragen.
| type | Gerendert als | defaultValue-Typ |
|---|---|---|
select | Single-Choice-Liste; Optionen kommen von optionsTool | string |
boolean | Kippschalter | boolean |
string | Texteingabe, auf Unschärfe festgelegt | string |
number | Zahleneingabe | number |
10Befehlspalette / Verknüpfungen / Kontextmenü
Alle drei sind unterschiedliche Einstiegspunkte für „ein Tool mit leeren Argumenten aufrufen“; Ein Plugin kann mehrere deklarieren.
| Feld | Form | Beschreibung |
|---|---|---|
commands | { tool, icon, title }[] | Wird in der Befehlspalette Strg/Befehl+K angezeigt und ausgelöst, nachdem der Benutzer danach gesucht hat. |
keybindings | { command, key }[] | command muss gleich tool eines Eintrags in commands[] sein. key verwendet die mod+shift+g-Notation, wobei mod Cmd auf macOS und Strg an anderer Stelle ist. Konflikte mit anderen Verknüpfungen werden nicht statisch überprüft. Wählen Sie daher ungewöhnliche Kombinationen aus. |
menus | { "session/context": { tool, icon, title }[] } | Zum Menü in einer Sitzungszeile hinzugefügt. Derzeit ist nur dieser Standort verfügbar. |
11Dokumentparser (documentParsers)
Wenn der Benutzer eine Datei in das Eingabefeld einfügt, sucht der Host nach Parsern, die von aktivierten Plugins deklariert wurden, nach MIME-Typ und übergibt den Dateiinhalt als Base64 an die entsprechende toolName. Dies ist kein Tool, das die KI aufrufen möchte. Listen Sie daher nicht auch das Parser-Tool unter tools auf, da es sonst als von der KI aufrufbares Tool angezeigt wird.
12RPC umkehren (host_request)
Der Plugin-Prozess verfügt über keine Electron-API. Wenn es eine echte Systemfähigkeit benötigt, sendet es host_request an den Host, der mit host_response oder host_error antwortet. Dieser Kanal ist völlig unabhängig von call_tool; Sie können es während der Bearbeitung eines Werkzeugaufrufs oder über einen Timer verwenden.
| capability | params | result | Voraussetzung |
|---|---|---|---|
show_notification | { title, body?, viewId? } | { shown: true } / { shown: false, reason: "disabled" | "unsupported" } | Erfordert die Berechtigung notifications. Gibt „deaktiviert“ anstelle eines Fehlers zurück, wenn der Benutzer Desktop-Benachrichtigungen in den Einstellungen deaktiviert hat. Wenn viewId auf eine Ihrer angedockten Ansichten zeigt, wird durch Klicken auf die Benachrichtigung die App in den Vordergrund gebracht und diese Ansicht erweitert. |
render_pdf | { outputPath, title, content } | {} | Inhalt ist Markdown; Der Host rendert mit seinem integrierten Renderer eine PDF-Datei in „outputPath“. |
13Lebenszyklus
| Bühne | Verhalten |
|---|---|
| Start | Standardmäßig faul: nicht mit der App gestartet, beim ersten Aufruf eines Ihrer Tools (KI, Symbolleistensymbol, Bedienfeld, Befehl, Dokumentanalyse) gegabelt. Plugins, die activationEvents: ["onStartupFinished"] deklarieren, starten direkt nach dem Start der App; Verwenden Sie dies nur für Plugins, die Hintergrund-Timer (Erinnerungen, Umfragen) benötigen, nicht für gewöhnliche Tool-Plugins. |
| Einwohner | Nach dem Start bleibt der Prozess aktiv und wird bei allen Toolaufrufen wiederverwendet. Sie können den Status im Speicher zwischenspeichern, gehen aber davon aus, dass er jederzeit neu gestartet werden kann. |
| Absturz | Wenn der Prozess unerwartet beendet wird, startet ihn der Host neu: sofort, dann nach 5 und 15 Sekunden. Nach drei aufeinanderfolgenden Fehlern wird der Vorgang als „abgestürzt“ markiert und es wird kein neuer Versuch mehr unternommen. Benutzer sehen den Status auf der Plugin-Seite. Alle Anrufe während des Flugs geben Fehler zurück. |
| Deaktivieren / deinstallieren / neu installieren | Der Prozess wird beendet und angedockte Ansichten und schwebende Panels werden zerstört; Bei einer Neuinstallation wird der gesamte Ordner ersetzt. |
| Protokolle | Ihre stdout/stderr werden mit dem Präfix der Plugin-ID in die App-Protokolldatei geschrieben. Zum Debuggen reicht einfaches console.log; siehe „Debugging & FAQ“. |
ELECTRON_RUN_AS_NODE=1, cwd ist der Plugin-Installationsordner und die Node-Version entspricht dem mit der App gebündelten Electron. Verlassen Sie sich nicht auf ein global installiertes Paket und gehen Sie nicht davon aus, dass npx existiert.14Verpackung und Verlagswesen
Verpackung
Zippen Sie den Plugin-Ordner mit manifest.json im Archivstammverzeichnis. Wenn Sie Abhängigkeiten von Drittanbietern haben, bündeln Sie diese zuerst mit esbuild/webpack in einer einzigen Datei, anstatt das Ganze zu versenden node_modules.
Veröffentlichung auf dem Marktplatz
AnBoWork → Extras → Plugins → Registerkarte „Marktplatz“ → „Plugin veröffentlichen“ in der oberen rechten Ecke, dann laden Sie die ZIP-Datei hoch. Einreichungen durchlaufen eine Überprüfung, bei der überprüft wird, ob die Manifestdeklaration mit dem Code (insbesondere den Berechtigungen) übereinstimmt. Nach der Genehmigung können andere Benutzer es auf dem Marktplatz finden und installieren, und die KI kann verifizierte Plugins für Benutzer automatisch installieren, wenn sie diese für erforderlich hält.
Aktualisierungen
Bump version und erneut veröffentlichen. Die App vergleicht die installierte Version mit der Marketplace-Version und fordert zur Aktualisierung auf; Bei einer Neuinstallation bleiben der aktivierte Status und die Einstellungswerte des Benutzers erhalten.
15Vollständiges Beispiel: Todo Quadrant
Ein echtes, funktionierendes Plugin (getrimmt): Die KI kann Aufgaben hinzufügen und entfernen, die rechte Seitenleiste zeigt ein Board, das in Echtzeit aktualisiert wird, und es kann Erinnerungen an Systembenachrichtigungen senden. Die Verkettung dieser drei umfasst das Tool-Protokoll, Push-Vorgänge in der angedockten Ansicht und Reverse RPC.
16Debugging und FAQ
| Symptom | Ursache und Lösung |
|---|---|
| Die Manifestvalidierung schlägt bei der Installation fehl | Vergleichen Sie jedes Feld mit der Tabelle „Manifestfelder“, da die Meldung Folgendes anzeigt: ID-Format, Haupt-/Eintrag darf nicht .. enthalten, Symbol muss auf der Zulassungsliste stehen, Tastenkombinationsbefehl muss auf ein vorhandenes Werkzeug in Befehlen verweisen, Breite zwischen 240 und 640. |
| Die KI ruft mein Werkzeug nie auf | Fast immer ein description Problem: Der Auslöser ist unklar oder nicht auf Englisch geschrieben. Siehe „Eine gute Beschreibung verfassen“. Stellen Sie außerdem sicher, dass der Werkzeugname nicht mit einem anderen Werkzeug kollidiert. |
| Anrufzeitüberschreitung (30 s) | Das Eingabeskript hat nicht mit tool_result geantwortet. Normalerweise wurde requestId nicht zurückgegeben, die Nachricht type ist falsch geschrieben oder das Skript hat beim Start einen Fehler gemacht und beendet. Suchen Sie im App-Protokoll nach Zeilen mit dem Präfix [plugin:your-id]. |
| Plugin-Status zeigt „abgestürzt“ | 3 aufeinanderfolgende Fehlstarts. Im Allgemeinen ein require eines fehlenden Pakets; Wenn Sie node index.js im Plugin-Ordner ausführen, wird es reproduziert. Schalten Sie das Plugin nach der Reparatur auf der Plugin-Seite aus und wieder ein. |
| Das Panel wird leer geöffnet | Falscher entry-Pfad oder ein JS-Fehler auf der Seite. Die Seite läuft in einer Sandbox ohne Node's require; Es ist nur window.pluginHost verfügbar. |
| Benachrichtigung erscheint nicht | In der Reihenfolge prüfen: Das Manifest deklariert notifications; das Ergebnis ist nicht shown:false (der Benutzer hat Desktop-Benachrichtigungen deaktiviert); Das Betriebssystem erlaubt Benachrichtigungen von AnBoWork. |
| Einstellungswerte sind nicht lesbar | Werte sind in message.context.config[id], nicht in params. |
Speicherort der Protokolldatei
| Betriebssystem | Weg |
|---|---|
| macOS | ~/Library/Logs/AnBoWork/main.log |
| Windows | %USERPROFILE%\AppData\Roaming\AnBoWork\logs\main.log |