תוסף מפתח מסמכים
בנו תוספים עבור אפליקציית שולחן העבודה AnBoWork: הוסף כלים חדשים עבור AI, עגן פאנל משלך ליד הפעלה, שלח הודעות מערכת, נתח פורמטים חדשים של קבצים. מספיק manifest.json בתוספת סקריפט כניסה אחד כדי להתחיל.
01סקירה כללית
תוסף AnBoWork הוא תוכנית Node.js רגילה. לאחר ההתקנה, האפליקציה מעבירה אותה כתהליך ילד עצמאי (צומת טהור, ללא Electron API) ומדברת איתו על הודעות בין תהליכים. אין צורך בחבילת SDK; כל מה שאתה צריך זה process.on('message') וprocess.send().
כל מה שתוסף יכול לעשות מוצהר באופן סטטי ב-manifest.json: דף ההסכמה להתקנה מראש וסקירת השוק יכולים לדעת אילו כלים הוא מוסיף ואיזה הרשאות הוא צריך מבלי להפעיל שום קוד פלאגין. כל ממשק המשתמש (סמלים של סרגל הכלים, הגדרות, לוח הפקודות, תפריטי הקשר) מוצג על ידי המארח מההצהרה; קוד הפלאגין לעולם אינו פועל בתוך החלון הראשי. רק תצוגות מעוינות ופאנלים צפים הם HTML משלך, והם פועלים בדפים מבודדים בארגז חול.
יכולות במבט חטוף
| שדה מניפסט | יְכוֹלֶת | איפה המשתמשים רואים את זה |
|---|---|---|
tools | הוסף כלים הניתנים להתקשרות עבור ה-AI | ה-AI קורא להם באופן אוטומטי בשיחה; שיחות כלי מוצגות בהפעלה |
views | תצוגה מתמשכת מעוגנת בסרגל הצד הימני של ההפעלה | סמל נוסף בסרגל הכלים של הפגישה פותח את הדף שלך מימין |
ui | חלון צף עצמאי | נפתח מתפריט "⋯" ברשימת התוספים |
sessionAction | סמל פעולה מתמשך בסרגל הכלים של הפגישה | לחיצה אחת מפעילה את הכלי שציינת |
configuration | ערכים בדף ההגדרות | הגדרות ← תצורת תוסף; ערכים מועברים בכל שיחה |
commands | ערכי לוח הפקודות Ctrl/Cmd+K | לוח פקודות |
keybindings | קיצורי מקלדת גלובליים | צירוף מקשים מפעיל פקודה |
menus | פריטי תפריט ההקשר של הפגישה | התפריט "⋯" / לחיצה ימנית בשורת הפעלה |
documentParsers | ניתוח קבצים ירד לתיבת הקלט | נקרא אוטומטית כאשר המשתמש מפיל קובץ תואם |
activationEvents | התחל ביחד עם האפליקציה | בִּלתִי נִרְאֶה; עבור תוספים שצריכים טיימרים ברקע |
permissions | הצהיר על הרשאות נדרשות | דף הסכמה להתקנה מראש |
02התחלה מהירה
תוסף מינימלי צריך רק שני קבצים.
1. כתוב manifest.json
2. כתוב את תסריט הערך
3. התקן באפליקציה
פתח את AnBoWork → סרגל עליון "כלים" → "תוספים" → "התקן מקומי" בפינה השמאלית העליונה, ולאחר מכן בחר את תיקיית הפלאגין (או zip שלה). דף הסכמה מפרט את ההרשאות המוצהרות וכל כלי לפני ההתקנה; אשר כדי להפעיל.
4. נסה את זה
בכל הפעלה, אמור ל-AI "בקש מהפלאגין לומר שלום לאליס". בהתבסס על תיאור הכלי ה-AI מחליט לקרוא ל-say_hello, והקריאה והתוצאה שלה מופיעות בסשן.
03שדות מניפסט
| שָׂדֶה | סוּג | דָרוּשׁ | תֵאוּר |
|---|---|---|---|
id | string | כֵּן | סגנון תחום הפוך, למשל. com.example.my-plugin. אותיות, ספרות, נקודות ומקפים בלבד. בלתי ניתן לשינוי ברגע שנוצר; התקנה חוזרת של אותו מזהה מטופלת כהתקנה מחדש. |
name | string | כֵּן | שם הפלאגין. יחד עם description הוא מוזן למודל כהקשר, לכן מומלץ באנגלית. |
version | string | כֵּן | גרסה סמנטית; השוק משתמש בו כדי לזהות עדכונים. |
description | string | כֵּן | משפט אחד שמתאר מה התוסף עושה (אנגלית). |
author | string | לֹא | מְחַבֵּר. |
readme | string | לֹא | תיאור ארוך המוצג בדף הפרטים של השוק, תומך ב-Markdown. תמונות בתוכו חייבות להיות https כתובות URL - נתיבים יחסיים לקבצים המצורפים ב-zip אינם נתמכים. |
icon | string | לֹא | סמל המוצג ברשימת השוק ובדף הפרטים - נתיב יחסי לקובץ ארוז ב-zip (למשל icon.png). חייב להיות PNG, לא SVG, לפחות 128×128. |
main | string | כֵּן | סקריפט כניסה, ביחס לתיקיית הפלאגין. .. בריחה מהתיקייה אסורה. |
permissions | string[] | כֵּן | network / filesystem / notifications; עשוי להיות מערך ריק. ראה "מודל הרשאה". |
tools | object[] | כֵּן | הצהרות כלי עבודה; עשוי להיות מערך ריק. ראה "כלים ופרוטוקול שיחות". |
documentParsers | object[] | לֹא | יכולת ניתוח קבצים. |
ui | object | לֹא | פאנל צף:{ entry, title } |
views | object[] | לֹא | תצוגות מעוגנות:{ id, title, icon, entry, width? } |
sessionAction | object | לֹא | סמל סרגל הכלים, לכל היותר אחד לכל תוסף. |
configuration | object[] | לֹא | רשימת ערכי הגדרות. |
commands | object[] | לֹא | ערכי לוח פקודות. |
keybindings | object[] | לֹא | קיצורי דרך. command חייב להתייחס ל-tool של ערך ב-commands[], אחרת ההתקנה נדחית. |
menus | object | לֹא | רק המיקום session/context זמין לעת עתה. |
activationEvents | string[] | לֹא | רק onStartupFinished לעת עתה. |
מוסכמות שפה לטקסט
Text in the manifest has two audiences. For the model: name, description, tools[].description, tools[].parameters.*.description. Write these in English; models understand English tool descriptions and fill parameters more reliably. For people: tools[].summary (one-line summary on the consent page), ui.title, views[].title, sessionAction.tooltip, configuration[].label, commands[].title and title inside menus. Write these in your target users' language.
04מודל ההרשאה
permissions חייב לשקף בכנות את מה שהקוד עושה בפועל. דף ההסכמה מראש להתקנה מפרט כל אחד מהם כך שמשתמשים יכולים להחליט אם להתקין; סקירת marketplace גם בודקת את ההצהרה מול הקוד.
| רְשׁוּת | מתי יש להצהיר על כך | איך המארח מתייחס לזה |
|---|---|---|
filesystem | קריאה או כתיבה של קבצי משתמש (קריאת קוד פרויקט, הפקת מסמכים, אחסון נתונים בתיקיית הבית) | הסכמה מדעת, מוצגת למשתמש. |
network | ביצוע כל בקשת רשת (ממשקי API של צד שלישי, הורדות) | הסכמה מדעת, מוצגת למשתמש. |
notifications | הצגת התראות מערכת באמצעות ה-RPC ההפוכה show_notification | נאכף: קריאה אליו ללא ההצהרה מחזירה host_error ולא מוצגת התראה. |
filesystem ו-network הן כרגע הצהרות ברמת הסכמה, לא ארגז חול של זמן ריצה: המארח לא מיירט את fs או fetch. בדיוק בגלל זה הצהרות חייבות להיות כנות. תוספים שמוצהרים בחסר נדחים בסקירת השוק ומאבדים את אמון המשתמש כאשר הם מתגלים. גם אל תצהיר יתר על המידה (הרשאות שאינן בשימוש גורמות למשתמשים להסס).פרטיות ונתונים
context.cwd היא תיקיית הפרויקט של המשתמש ועשויה להכיל קוד מקור ותצורה רגישה; ארגומנטים של כלי עשויים להכיל את השיחה של המשתמש. אל תשלח נתונים אלה דרך הרשת אלא אם התכונה דורשת זאת, וכאשר תעשה זאת, ציין ב-description ו-summary מה נשלח ולמי. שמור את הנתונים הקבועים של התוסף עצמו בקובץ תחת תיקיית הבית של המשתמש הקרויה על שם מזהה התוסף, כך שקל למצוא אותו בעת הסרת ההתקנה.
05כלים ופרוטוקול שיחות
הַצהָרָה
| שָׂדֶה | תֵאוּר |
|---|---|
name | שם הכלי באותיות קטנות וקווים תחתונים, ייחודי בכל האפליקציה (הוא רשום בדגם לצד כלים מובנים וכלי תוספים אחרים). |
description | תיאור הדגם (אנגלית). ציינו שלושה דברים: מה הכלי עושה, מה אומר המשתמש מתי צריך לקרוא לו ומתי אסור לקרוא לו. זהו השדה החשוב ביותר עבור האם ה-AI משתמש בתוסף שלך. |
summary | סיכום קריא אנושי בשורה אחת המוצג בדף ההסכמה. אופציונלי אך מומלץ בחום; אחרת מוצג במקום תיאור קטום. |
parameters | אובייקט JSON Schema סטנדרטי עם description בכל מאפיין. המודל ממלא ארגומנטים ממנו והמארח מעביר אותם ללא אימות נוסף, אז בדוק שדות חובה בקוד שלך. |
renderAs | אופציונלי; כרגע רק checklist: המארח מעבד את מערך todos מארגומנטי השיחה ככרטיס רשימת בדיקה, ראה להלן. |
tools[] כאן - sessionAction.tool, commands[].tool והשדה tool בתוך menus מסומנים רק כמחרוזות לא ריקות בזמן ההתקנה; המארח לא מאמת שהשם מוצהר בtools[], ועדיין שולח שיחה תחת השם הזה כשהלחצן, קיצור הדרך או פריט התפריט מופעלים. אז ניתן לטפל בפעולה טהורה המופעלת על ידי ממשק משתמש ב-index.js שלך מבלי להופיע ב-tools[] - אבל אז ה-AI לעולם לא יוכל לראות או לקרוא לזה. אם אתה רוצה שאותה פעולה תהיה ניתנת להפעלה הן על ידי לחיצה והן על ידי הבינה המלאכותית הפועלת על בקשת צ'אט, הכריז גם על אותו שם ב-tools[], כך ששתי נקודות הכניסה חולקות מטפל אחד; אם זה נועד להישאר ממשק משתמש בלבד, השאר אותו לא מוצהר - אין צורך להוסיף ערך רק כדי להיראות שלם.פרוטוקול הודעה
המארח שולח call_tool; התוסף חייב להשיב עם tool_result או tool_error הנושא את אותו requestId. שיחה ללא מענה תוך 30 שניות פסק זמן והדגם מקבל שגיאה.
content מקבל רק text וimage בלוקים (תמונה בתור base64 data פלוס mimeType); סוגים אחרים נשמטים. details הם נתונים מובנים שרירותיים שלעולם לא מוזנים למודל; זה מיועד לעיבוד ממשק משתמש מארח ולתצוגות מעוגנות משלך.
תוצאות קובץ: כרטיסי קובץ
עיבוד רשימת רשימת תיוג: רשימת תיוג renderAs
כתיבת תיאור טוב
תאר את הטריגר בציווי ("התקשר לזה כשהמשתמש מבקש...") וציין אי הכללות ("אל תתקשר לזה בשביל..."). אם התוצאה היא קובץ, בקש מהמודל להפנות לקישור הקובץ שהוחזר במקום לטעון שהוא נוצר. אם ארגומנטים מועברים ל-API של דור חיצוני, אמור באיזו שפה הם צריכים להיות. הימנע מ-one-liners כמו "manage todos"; המודל לא יידע מתי להשתמש בכלי.
06תצוגות מעוינות (תצוגות)
תצוגה מעוגנת היא עמוד קבוע בסרגל הצד הימני של ההפעלה: סמל נוסף מופיע בסרגל הכלים של ההפעלה וה-HTML שלך מופיע בצד ימין כאשר הוא נפתח. מצב העמוד (מיקום גלילה, טיוטות) שורד הפעלה של החלפת וקיפול/הרחבה, אותה סמנטיקה כמו תצוגת סרגל צד VS Code.
| שָׂדֶה | תֵאוּר |
|---|---|
id | ייחודי בתוך הפלאגין. |
title | טקסט הסבר על הסמל (ניתן לקריאה על ידי אדם). |
icon | בחר מרשימת ההיתרים המארח: git-branch, checklist. שומר על סמלים עקביים בכל האפליקציה; תמונות מותאמות אישית אינן מתקבלות. |
entry | קובץ HTML, ביחס לתיקיית הפלאגין. |
width | רוחב פאנל ברירת מחדל אופציונלי בפיקסלים, 240 עד 640, ברירת מחדל 360. משתמשים יכולים לגרור כדי לשנות את הגודל ולזכור את הגודל. |
זמן ריצה של עמוד
הדף פועל בארגז חול (sandbox + contextIsolation, ללא Node, ללא גישה לנתוני אפליקציה מארח) ויכול לדבר רק עם תהליך הפלאגין שלו באמצעות השיטות המעטות ב-window.pluginHost. הביאו סגנונות משלכם; מומלץ לעקוב אחר ערכת האור/כהה של האפליקציה כמו בדוגמה למטה.
דפוס מומלץ: בטעינה ראשונה התקשר לאחד מכלי השאילתה שלך עם invoke() ובקש ממנו להחזיר נתונים מובנים ב-details; לאחר מכן דחוף כל שינוי מתהליך הפלאגין עם ui_push במקום סקר. כאשר ה-AI משנה נתונים בשיחה, הפאנל מתרענן מיד.
07פאנל צף (UI)
ui: { entry, title } מכריז על חלון צף עצמאי (900×700) שמשתמשים פותחים מתפריט "⋯" ברשימת התוספים; זה נהרס מקרוב. סביבת הדף וממשק ה-API של window.pluginHost זהים לתצוגות מעוגנות, ו-ui_push מועבר הן ללוח הצף והן לתצוגות המעוגנות. מתאים לפנלים גדולים הנפתחים מדי פעם; השתמש ב-views לתוכן שאמור להישאר ליד ההפעלה.
08סמל סרגל הכלים של הפעלה (SessionAction)
לכל תוסף סמל אחד מתמשך לכל תוסף. לחיצה עליו קוראת tool עם ארגומנטים ריקים, כך שהכלי הזה חייב לעשות משהו משמעותי ללא פרמטרים.
| שָׂדֶה | תֵאוּר |
|---|---|
tool | כלי להתקשר בלחיצה. |
icon | שם הסמל הרשום. |
tooltip | רחף טקסט. |
visibleTool | אופציונלי. כאשר הוא מוגדר, הוא נקרא עם ארגומנטים ריקים לפני עיבוד והערך הבולאלי details.visible בתוצאה מחליט אם הסמל מוצג. שימושי לבדיקות זמן ריצה כגון "האם התיקיה הנוכחית היא מאגר git". |
09הגדרות (תצורה)
ערכים מוצהרים מופיעים תחת תצורת הפלאגין בדף ההגדרות. המארח מאחסן ערכים שהשתנו על ידי המשתמש ומעביר אותם כ-context.config בכל call_tool (מקישים על ידי id, נופלים חזרה ל-defaultValue), בין אם השיחה מגיעה מה-AI, מסמל סרגל הכלים או מהפאנל שלך. אתה אף פעם לא צריך לבקש אותם.
| type | מוצג בתור | סוג defaultValue |
|---|---|---|
select | רשימה חד-בחירה; האפשרויות מגיעות מ-optionsTool | string |
boolean | החלף מתג | boolean |
string | קלט טקסט, מחויב בטשטוש | string |
number | קלט מספר | number |
10לוח פקודות / קיצורי דרך / תפריט הקשר
שלושתן הן נקודות כניסה שונות עבור "התקשר לכלי עם ארגומנטים ריקים"; תוסף יכול להכריז על כמה.
| שָׂדֶה | צוּרָה | תֵאוּר |
|---|---|---|
commands | { tool, icon, title }[] | מוצג בפלטת הפקודות Ctrl/Cmd+K ומופעל לאחר שהמשתמש מחפש אותה. |
keybindings | { command, key }[] | command חייב להיות שווה ל-tool של ערך בcommands[]. key משתמש בסימון mod+shift+g, כאשר mod הוא Cmd ב-macOS ו-Ctrl במקום אחר. התנגשויות עם קיצורי דרך אחרים אינם מסומנים באופן סטטי, אז בחר שילובים לא שכיחים. |
menus | { "session/context": { tool, icon, title }[] } | נוסף לתפריט בשורת הפעלה. רק מיקום זה זמין לעת עתה. |
11מנתחי מסמכים (documentParsers)
כאשר המשתמש מפיל קובץ לתיבת הקלט, המארח מחפש מנתחים שהוכרזו על ידי תוספים מופעלים לפי סוג MIME ומעביר את תוכן הקובץ כ-base64 ל-toolName התואם. זה לא כלי שה-AI מחליט לקרוא לו, אז תרשום גם לא את כלי הניתוח תחת tools, אחרת הוא ייחשף ככלי שניתן להתקשר אליו.
12RPC הפוך (host_request)
לתהליך הפלאגין אין Electron API. כאשר הוא זקוק ליכולת מערכת אמיתית הוא שולח host_request למארח, אשר משיב עם host_response או host_error. ערוץ זה אינו תלוי לחלוטין ב-call_tool; אתה יכול להשתמש בו בזמן טיפול בשיחת כלי או מטיימר.
| capability | params | result | תְנַאִי מוּקדָם |
|---|---|---|---|
show_notification | { title, body?, viewId? } | { shown: true } / { shown: false, reason: "disabled" | "unsupported" } | דורש הרשאת notifications. מחזירה מושבתת במקום שגיאה כאשר המשתמש כיבה את הודעות שולחן העבודה בהגדרות. כאשר viewId מצביע על אחת מהתצוגות המעוגנות שלך, לחיצה על ההתראה מביאה את האפליקציה לחזית ומרחיבה את התצוגה. |
render_pdf | { outputPath, title, content } | {} | התוכן הוא Markdown; המארח מעבד PDF ל-outputPath עם המעבד המובנה שלו. |
13מחזור חיים
| שָׁלָב | הִתְנַהֲגוּת |
|---|---|
| הַתחָלָה | עצלן כברירת מחדל: לא הופעל עם האפליקציה, התפצל בקריאה הראשונה לאחד הכלים שלך (AI, סמל סרגל הכלים, חלונית, פקודה, ניתוח מסמכים). תוספים המכריזים על activationEvents: ["onStartupFinished"] מתחילים מיד לאחר סיום השקת האפליקציה; השתמש בזה רק עבור תוספים שצריכים טיימרים ברקע (תזכורות, סקרים), לא עבור תוספים של כלים רגילים. |
| תוֹשָׁב | לאחר שהתחיל התהליך נשאר בחיים ונעשה בו שימוש חוזר בקריאות לכלים. אתה יכול לשמור מצב במטמון בזיכרון, אבל הנחה שניתן להפעיל אותו מחדש בכל עת. |
| לְהִתְרַסֵק | אם התהליך יוצא באופן בלתי צפוי, המארח מפעיל אותו מחדש: מיד, ולאחר מכן לאחר 5 ו-15 שניות. לאחר 3 כישלונות רצופים הוא מסומן "התרסק" ולא נוסה שוב; משתמשים רואים את הסטטוס בדף הפלאגין. שיחות בטיסה כל שגיאות החזרה. |
| השבת / הסר / התקן מחדש | התהליך מסתיים ותצוגות מעוגנות ולוחות צפים נהרסים; התקנה מחדש מחליפה את כל התיקיה. |
| יומנים | stdout/stderr שלך נכתבים לקובץ יומן האפליקציה עם קידומת מזהה הפלאגין. רגיל console.log מספיק לניפוי באגים; ראה "ניפוי באגים ושאלות נפוצות". |
ELECTRON_RUN_AS_NODE=1, cwd היא תיקיית התקנת הפלאגין, וגרסת ה-Node תואמת את האלקטרון המצורף לאפליקציה. אל תסתמך על חבילה כלשהי המותקנת ברחבי העולם ואל תניח שקיים npx.14אריזה והוצאה לאור
אריזה
דחס את תיקיית הפלאגין עם manifest.json בשורש הארכיון. אם יש לך תלות של צד שלישי, אגד אותם לקובץ בודד עם esbuild/webpack תחילה במקום לשלוח את כל node_modules.
פרסום לשוק
AnBoWork → כלים → פלאגינים → כרטיסיית "Marketplace" → "פרסם תוסף" בפינה השמאלית העליונה, ולאחר מכן העלה את ה-zip. ההגשות נכנסות לבדיקה, אשר בודקת שהצהרת המניפסט תואמת לקוד (במיוחד הרשאות). לאחר האישור, משתמשים אחרים יכולים למצוא ולהתקין אותו בשוק, וה-AI יכול להתקין פלאגינים מאומתים עבור משתמשים באופן אוטומטי כאשר הוא רואה בהם צורך.
עדכונים
קפוץ version ופרסם שוב. האפליקציה משווה את הגרסה המותקנת לגרסת ה-marketplace ומבקשת לעדכן; התקנה מחדש שומרת על ערכי המצב וההגדרות המופעלים של המשתמש.
15דוגמה מלאה: Todo Quadrant
תוסף אמיתי ועובד (חתוך): ה-AI יכול להוסיף ולהסיר מטלות, סרגל הצד הימני מציג לוח שמתרענן בזמן אמת, והוא יכול לשלוח תזכורות למערכת. שרשרת שלושת אלה מכסה את פרוטוקול הכלי, דחיפות תצוגה מעוגנות ו-RPC לאחור.
16איתור באגים ושאלות נפוצות
| סִימפּטוֹם | סיבה ותיקון |
|---|---|
| אימות המניפסט נכשל בהתקנה | בדוק כל שדה מול טבלת "שדות הגילוי" כפי שההודעה מציינת: פורמט id, ראשי/ערך לא חייב להכיל .., הסמל חייב להיות ברשימת ההיתרים, פקודת חיבורי המקשים חייבת להצביע על כלי קיים בפקודות, רוחב בין 240 ל-640. |
| ה-AI אף פעם לא קורא לכלי שלי | כמעט תמיד בעיה של description: הטריגר לא ברור או שהוא לא כתוב באנגלית. ראה "כתיבת תיאור טוב". בדוק גם ששם הכלי לא מתנגש בכלי אחר. |
| זמן קצוב לשיחה (30 שניות) | סקריפט הערך לא השיב עם tool_result. בדרך כלל requestId לא הוד בחזרה, ההודעה type מאויתת שגויה, או שהתסריט הושלך בהפעלה ויצא. חפש שורות עם קידומת [plugin:your-id] ביומן האפליקציה. |
| סטטוס הפלאגין מראה "התרסק" | 3 התחלות כושלות רצופות. בדרך כלל require של חבילה חסרה; הפעלת node index.js בתיקיית הפלאגין משחזרת אותו. לאחר התיקון, כבה את התוסף והדלק אותו שוב בדף הפלאגין. |
| הלוח נפתח ריק | נתיב entry שגוי, או שגיאת JS בדף. הדף פועל בארגז חול ללא require של Node; רק window.pluginHost זמין. |
| הודעה לא מופיעה | בדוק לפי הסדר: המניפסט מצהיר על notifications; התוצאה היא לא shown:false (המשתמש כיבה את ההתראות בשולחן העבודה); מערכת ההפעלה מאפשרת התראות מ-AnBoWork. |
| ערכי ההגדרות אינם ניתנים לקריאה | הערכים נמצאים ב-message.context.config[id], לא ב-params. |
מיקום קובץ היומן
| מערכת הפעלה | נָתִיב |
|---|---|
| macOS | ~/Library/Logs/AnBoWork/main.log |
| Windows | %USERPROFILE%\AppData\Roaming\AnBoWork\logs\main.log |