// डेवलपर गाइड

प्लगइन डेवलपर दस्तावेज़

AnBoWork डेस्कटॉप ऐप के लिए प्लगइन्स बनाएं: एआई के लिए नए टूल जोड़ें, एक सत्र के बगल में अपना खुद का पैनल डॉक करें, सिस्टम नोटिफिकेशन भेजें, नए फ़ाइल स्वरूपों को पार्स करें। आरंभ करने के लिए एक मैनिफ़ेस्ट.जेसन और एक प्रविष्टि स्क्रिप्ट पर्याप्त है।

01सिंहावलोकन

AnBoWork प्लगइन एक सादा Node.js प्रोग्राम है। इंस्टालेशन के बाद ऐप इसे एक स्टैंडअलोन चाइल्ड प्रोसेस (शुद्ध नोड, कोई इलेक्ट्रॉन एपीआई नहीं) के रूप में फोर्क करता है और इंटर-प्रोसेस संदेशों पर इससे बात करता है। किसी SDK पैकेज की आवश्यकता नहीं है; आपको बस process.on('message') और process.send() चाहिए।

एक प्लगइन जो कुछ भी कर सकता है उसे manifest.json में स्थिर रूप से घोषित किया जाता है: प्री-इंस्टॉल सहमति पृष्ठ और मार्केटप्लेस समीक्षा यह बता सकती है कि यह कौन से टूल जोड़ता है और बिना कोई प्लगइन कोड चलाए इसे किन अनुमतियों की आवश्यकता है। सभी यूआई (टूलबार आइकन, सेटिंग्स, कमांड पैलेट, संदर्भ मेनू) घोषणा से होस्ट द्वारा प्रस्तुत किए जाते हैं; प्लगइन कोड कभी भी मुख्य विंडो के अंदर नहीं चलता। केवल डॉक किए गए दृश्य और फ़्लोटिंग पैनल ही आपके स्वयं के HTML हैं, और वे अलग-अलग सैंडबॉक्स वाले पृष्ठों में चलते हैं।

क्षमताएं एक नज़र में

प्रकट क्षेत्रक्षमताजहां यूजर्स इसे देखते हैं
toolsएआई के लिए कॉल करने योग्य उपकरण जोड़ेंएआई उन्हें बातचीत में स्वचालित रूप से बुलाता है; टूल कॉल सत्र में दिखाए जाते हैं
viewsसतत दृश्य सत्र के दाएँ साइडबार में डॉक किया गयासत्र टूलबार में एक अतिरिक्त आइकन आपके पृष्ठ को दाईं ओर खोलता है
uiस्टैंडअलोन फ्लोटिंग विंडोप्लगइन सूची में "⋯" मेनू से खोला गया
sessionActionसत्र टूलबार में लगातार क्रिया आइकनएक क्लिक आपके द्वारा निर्दिष्ट टूल चलाता है
configurationसेटिंग पृष्ठ पर प्रविष्टियाँसेटिंग्स → प्लगइन कॉन्फ़िगरेशन; प्रत्येक कॉल के साथ मान पारित किए जाते हैं
commandsCtrl/Cmd+K कमांड पैलेट प्रविष्टियाँकमांड पैलेट
keybindingsवैश्विक कीबोर्ड शॉर्टकटएक कुंजी संयोजन एक आदेश को ट्रिगर करता है
menusसत्र संदर्भ-मेनू आइटमसत्र पंक्ति पर "⋯" / राइट-क्लिक मेनू
documentParsersपार्स फ़ाइलें इनपुट बॉक्स में गिरा दी गईंजब उपयोगकर्ता मिलान वाली फ़ाइल छोड़ता है तो स्वचालित रूप से कॉल किया जाता है
activationEventsऐप के साथ मिलकर शुरुआत करेंअदृश्य; उन प्लगइन्स के लिए जिन्हें बैकग्राउंड टाइमर की आवश्यकता होती है
permissionsआवश्यक अनुमतियाँ घोषित करेंसहमति पृष्ठ पूर्व-स्थापित करें

02त्वरित शुरुआत

एक न्यूनतम प्लगइन को केवल दो फ़ाइलों की आवश्यकता होती है।

my-plugin/
├── manifest.json   # plugin manifest (required)
├── index.js        # entry script, referenced by manifest.main (required)
├── view.html       # docked view page (optional, manifest.views[].entry)
└── ui.html         # floating panel page (optional, manifest.ui.entry)

1. मेनिफ़ेस्ट.जेसन लिखें

{
  "id": "com.example.hello",
  "name": "Hello Plugin",
  "version": "1.0.0",
  "description": "Say hello to the user.",
  "main": "index.js",
  "permissions": [],
  "tools": [
    {
      "name": "say_hello",
      "summary": "Greet the user by name",
      "description": "Return a greeting for the given name. Call this when the user explicitly asks the plugin to say hello.",
      "parameters": {
        "type": "object",
        "properties": {
          "name": { "type": "string", "description": "Who to greet." }
        },
        "required": ["name"]
      }
    }
  ]
}

2. प्रवेश स्क्रिप्ट लिखें

// The entry script runs in a standalone Node.js child process (ELECTRON_RUN_AS_NODE=1).
// Only Node built-ins and dependencies shipped inside the plugin folder are available;
// there is no Electron API.
process.on('message', (msg) => {
  if (!msg || msg.type !== 'call_tool') return;
  const { requestId, toolName, params } = msg;
  try {
    if (toolName !== 'say_hello') throw new Error(`unknown tool: ${toolName}`);
    process.send({
      type: 'tool_result',
      requestId,
      content: [{ type: 'text', text: `Hello, ${params.name}!` }],
    });
  } catch (err) {
    process.send({ type: 'tool_error', requestId, message: err.message });
  }
});

3. ऐप में इंस्टॉल करें

ऊपरी दाएं कोने में AnBoWork → शीर्ष बार "टूल्स" → "प्लगइन्स" → "स्थानीय रूप से इंस्टॉल करें" खोलें, फिर प्लगइन फ़ोल्डर (या उसका एक ज़िप) चुनें। एक सहमति पृष्ठ स्थापना से पहले घोषित अनुमतियों और प्रत्येक उपकरण को सूचीबद्ध करता है; सक्षम करने की पुष्टि करें.

4. इसे आज़माएं

किसी भी सत्र में, एआई से कहें "ऐलिस को नमस्ते कहने के लिए प्लगइन से पूछें"। टूल विवरण के आधार पर एआई say_hello को कॉल करने का निर्णय लेता है, और कॉल और उसका परिणाम सत्र में दिखाई देता है।

बख्शीश
AnBoWork के अंदर का AI आपके लिए प्लगइन भी उत्पन्न कर सकता है (जैसे कि "मुझे एक प्लगइन लिखें जो X करता है" और यह create_local_plugin को कॉल करता है)। जब तक आप प्लगइन पेज पर कोड की समीक्षा नहीं करते हैं और उन्हें मैन्युअल रूप से सक्षम नहीं करते हैं, तब तक जेनरेट किए गए प्लगइन्स डिफ़ॉल्ट रूप से अक्षम होते हैं। यह मार्गदर्शिका एआई-जनरेटेड प्लगइन्स को पढ़ने और संशोधित करने पर समान रूप से लागू होती है।

03प्रकट क्षेत्र

मैदानप्रकारआवश्यकविवरण
idstringहाँरिवर्स-डोमेन शैली, उदा. com.example.my-plugin. केवल अक्षर, अंक, बिंदु और हाइफ़न। एक बार निर्मित होने पर अपरिवर्तनीय; उसी आईडी को दोबारा इंस्टॉल करना रीइंस्टॉल माना जाता है।
namestringहाँप्लगइन नाम. description के साथ इसे संदर्भ के रूप में मॉडल में फीड किया जाता है, इसलिए अंग्रेजी की अनुशंसा की जाती है।
versionstringहाँअर्थपूर्ण संस्करण; बाज़ार इसका उपयोग अपडेट का पता लगाने के लिए करता है।
descriptionstringहाँप्लगइन क्या करता है इसका वर्णन करने वाला एक वाक्य (अंग्रेजी)।
authorstringनहींलेखक।
readmestringनहींमार्केटप्लेस विवरण पृष्ठ पर दिखाया गया लंबा-चौड़ा विवरण, मार्कडाउन का समर्थन करता है। इसके अंदर की छवियां https यूआरएल होनी चाहिए - ज़िप में बंडल की गई फ़ाइलों के सापेक्ष पथ समर्थित नहीं हैं।
iconstringनहींमार्केटप्लेस सूची और विवरण पृष्ठ में दिखाया गया आइकन - ज़िप में बंडल की गई फ़ाइल का एक सापेक्ष पथ (उदाहरण के लिए icon.png)। पीएनजी होना चाहिए, एसवीजी नहीं, कम से कम 128×128।
mainstringहाँप्लगइन फ़ोल्डर के सापेक्ष प्रविष्टि स्क्रिप्ट। .. फ़ोल्डर से भागने की अनुमति नहीं है।
permissionsstring[]हाँnetwork / filesystem / notifications; एक खाली सरणी हो सकती है. "अनुमति मॉडल" देखें।
toolsobject[]हाँउपकरण घोषणाएँ; एक खाली सरणी हो सकती है. "टूल्स एवं कॉल प्रोटोकॉल" देखें।
documentParsersobject[]नहींफ़ाइल पार्सिंग क्षमता.
uiobjectनहींफ़्लोटिंग पैनल:{ entry, title }
viewsobject[]नहींडॉक किए गए दृश्य:{ id, title, icon, entry, width? }
sessionActionobjectनहींटूलबार आइकन, प्रति प्लगइन अधिकतम एक।
configurationobject[]नहींसेटिंग्स प्रविष्टियों की सूची.
commandsobject[]नहींकमांड पैलेट प्रविष्टियाँ.
keybindingsobject[]नहींशॉर्टकट. command को commands[] में किसी प्रविष्टि के tool का संदर्भ देना होगा, अन्यथा इंस्टॉलेशन अस्वीकार कर दिया जाएगा।
menusobjectनहींअभी केवल session/context स्थान उपलब्ध है।
activationEventsstring[]नहींअभी के लिए केवल onStartupFinished।

पाठ के लिए भाषा परंपराएँ

मेनिफेस्ट में पाठ के दो श्रोता हैं। मॉडल के लिए: name, description, tools[].description, tools[].parameters.*.description. इन्हें अंग्रेजी में लिखें; मॉडल अंग्रेजी टूल विवरण को समझते हैं और मापदंडों को अधिक विश्वसनीय रूप से भरते हैं। लोगों के लिए: tools[].summary (सहमति पृष्ठ पर एक-पंक्ति सारांश), ui.title, views[].title, sessionAction.tooltip, configuration[].label, commands[].title और title अंदर menus। इन्हें अपने लक्षित उपयोगकर्ताओं की भाषा में लिखें।

{
  "id": "com.example.full",
  "name": "Full Example",
  "version": "1.2.0",
  "description": "Every contribution point in one manifest.",
  "author": "Example Inc.",
  "readme": "## Full Example\n\nLonger Markdown shown on the marketplace detail page. Images must be https URLs.",
  "icon": "icon.png",
  "main": "index.js",
  "permissions": ["filesystem", "network", "notifications"],
  "activationEvents": ["onStartupFinished"],
  "tools": [
    {
      "name": "do_something",
      "summary": "Do one thing to the current project",
      "description": "…English. State clearly when to call this and when not to…",
      "parameters": { "type": "object", "properties": {}, "required": [] },
      "renderAs": "checklist"
    },
    { "name": "is_available", "summary": "Whether the current folder applies", "description": "…", "parameters": { "type": "object", "properties": {} } },
    { "name": "list_modes", "summary": "List selectable modes", "description": "…", "parameters": { "type": "object", "properties": {} } }
  ],
  "documentParsers": [
    { "mimeType": "text/markdown", "toolName": "parse_markdown" }
  ],
  "ui": { "entry": "ui.html", "title": "Example Panel" },
  "views": [
    { "id": "board", "title": "Example Board", "icon": "checklist", "entry": "view.html", "width": 380 }
  ],
  "sessionAction": {
    "tool": "do_something",
    "icon": "git-branch",
    "tooltip": "Do one thing to the current project",
    "visibleTool": "is_available"
  },
  "configuration": [
    { "id": "mode", "label": "Mode", "type": "select", "optionsTool": "list_modes", "defaultValue": "auto" },
    { "id": "verbose", "label": "Verbose output", "type": "boolean", "defaultValue": false },
    { "id": "prefix", "label": "Prefix", "type": "string", "defaultValue": "" },
    { "id": "limit", "label": "Max items", "type": "number", "defaultValue": 20 }
  ],
  "commands": [
    { "tool": "do_something", "icon": "git-branch", "title": "Do one thing to the current project" }
  ],
  "keybindings": [
    { "command": "do_something", "key": "mod+shift+d" }
  ],
  "menus": {
    "session/context": [
      { "tool": "do_something", "icon": "git-branch", "title": "Do one thing to this session" }
    ]
  }
}

04अनुमति मॉडल

permissions को ईमानदारी से प्रतिबिंबित करना चाहिए कि कोड वास्तव में क्या करता है। प्री-इंस्टॉल सहमति पृष्ठ प्रत्येक को सूचीबद्ध करता है ताकि उपयोगकर्ता यह तय कर सकें कि इंस्टॉल करना है या नहीं; मार्केटप्लेस समीक्षा कोड के विरुद्ध घोषणा की भी जांच करती है।

अनुमतिजब इसे घोषित किया जाना चाहिएमेज़बान इसके साथ कैसा व्यवहार करता है
filesystemउपयोगकर्ता फ़ाइलें पढ़ना या लिखना (प्रोजेक्ट कोड पढ़ना, दस्तावेज़ बनाना, होम फ़ोल्डर में डेटा संग्रहीत करना)सूचित सहमति, उपयोगकर्ता को दिखाई गई।
networkकोई भी नेटवर्क अनुरोध करना (तृतीय-पक्ष एपीआई, डाउनलोड)सूचित सहमति, उपयोगकर्ता को दिखाई गई।
notificationsshow_notification रिवर्स आरपीसी के माध्यम से सिस्टम सूचनाएं दिखा रहा हैEnforced: घोषणा के बिना इसे कॉल करने पर रिटर्न host_error आता है और कोई अधिसूचना नहीं दिखाई जाती है।
टिप्पणी
प्लगइन चाइल्ड प्रक्रिया एक पूर्ण Node.js वातावरण है। filesystem और network वर्तमान में सहमति-स्तर की घोषणाएं हैं, रनटाइम सैंडबॉक्स नहीं: होस्ट fs या fetch को इंटरसेप्ट नहीं करता है। यही कारण है कि घोषणाएँ ईमानदार होनी चाहिए। जिन प्लगइन्स की घोषणा कम की जाती है उन्हें बाज़ार समीक्षा में अस्वीकार कर दिया जाता है और खोजे जाने पर उपयोगकर्ता का विश्वास खो देते हैं। अति-घोषित न करें (अप्रयुक्त अनुमतियाँ उपयोगकर्ताओं को झिझकती हैं)।

गोपनीयता और डेटा

context.cwd उपयोगकर्ता का प्रोजेक्ट फ़ोल्डर है और इसमें स्रोत कोड और संवेदनशील कॉन्फ़िगरेशन हो सकता है; टूल तर्कों में उपयोगकर्ता की बातचीत शामिल हो सकती है। इस डेटा को नेटवर्क पर तब तक न भेजें जब तक सुविधा के लिए इसकी आवश्यकता न हो, और जब आप ऐसा करें, तो description और summary में बताएं कि क्या भेजा गया है और किसे भेजा गया है। प्लगइन के स्वयं के लगातार डेटा को प्लगइन आईडी के नाम पर उपयोगकर्ता के होम फ़ोल्डर के नीचे एक फ़ाइल में रखें, ताकि अनइंस्टॉल करते समय इसे ढूंढना आसान हो।

05उपकरण एवं कॉल प्रोटोकॉल

घोषणा

मैदानविवरण
nameटूल का नाम छोटे अक्षरों और अंडरस्कोर में है, जो पूरे ऐप में अद्वितीय है (यह बिल्ट-इन टूल और अन्य प्लगइन्स टूल के साथ मॉडल के साथ पंजीकृत है)।
descriptionमॉडल के लिए विवरण (अंग्रेजी)। तीन बातें बताएं: टूल क्या करता है, उपयोगकर्ता क्या कहता है कि इसे कब कॉल किया जाना चाहिए, और कब इसे कॉल नहीं किया जाना चाहिए। एआई आपके प्लगइन का उपयोग करता है या नहीं, इसके लिए यह सबसे महत्वपूर्ण क्षेत्र है।
summaryसहमति पृष्ठ पर एक पंक्ति का मानव-पठनीय सारांश दिखाया गया है। वैकल्पिक लेकिन दृढ़ता से अनुशंसित; अन्यथा इसके स्थान पर एक छोटा विवरण दिखाया गया है।
parametersप्रत्येक संपत्ति पर description के साथ मानक JSON स्कीमा ऑब्जेक्ट। मॉडल इससे तर्क भरता है और होस्ट उन्हें बिना अतिरिक्त सत्यापन के पास कर देता है, इसलिए अपने कोड में आवश्यक फ़ील्ड जांचें।
renderAsवैकल्पिक; वर्तमान में केवल checklist: होस्ट कॉल तर्कों से todos सरणी को चेकलिस्ट कार्ड के रूप में प्रस्तुत करता है, नीचे देखें।
टिप्पणी
मॉडल यहां केवल tools[] में घोषित टूल नामों को कॉल कर सकता है - sessionAction.tool, commands[].tool, और menus के अंदर tool फ़ील्ड को केवल इंस्टॉल समय पर गैर-रिक्त स्ट्रिंग के रूप में जांचा जाता है; होस्ट not सत्यापित करता है कि नाम tools[] में घोषित किया गया है, और बटन, शॉर्टकट या मेनू आइटम ट्रिगर होने पर भी उस नाम के तहत कॉल भेजता है। तो पूरी तरह से यूआई-ट्रिगर कार्रवाई को tools[] में प्रकट हुए बिना पूरी तरह से आपके index.js में नियंत्रित किया जा सकता है - लेकिन फिर एआई इसे कभी भी देख या कॉल नहीं कर सकता है। यदि आप चाहते हैं कि चैट अनुरोध पर क्लिक करके और एआई द्वारा कार्रवाई करके समान कार्रवाई शुरू की जा सके, तो उसी नाम को tools[] में भी घोषित करें, ताकि दोनों प्रवेश बिंदु एक हैंडलर साझा करें; यदि इसका उद्देश्य केवल यूआई ही रहना है, तो इसे अघोषित छोड़ दें - केवल पूर्ण दिखने के लिए कोई प्रविष्टि जोड़ने की आवश्यकता नहीं है।

संदेश प्रोटोकॉल

होस्ट call_tool भेजता है; प्लगइन को समान requestId वाले tool_result या tool_error के साथ उत्तर देना होगा। 30 सेकंड के भीतर कोई उत्तर न मिलने पर कॉल आउट हो जाती है और मॉडल को एक त्रुटि प्राप्त होती है।

// host → plugin
{
  "type": "call_tool",
  "requestId": "0b2d…",          // unique per call, echo it back unchanged
  "toolName": "do_something",
  "params": { "name": "…" },     // arguments validated against tools[].parameters
  "context": {
    "cwd": "/Users/me/project",  // project folder of the calling session; a temp folder for chat sessions; empty string for document parsing
    "config": { "mode": "auto", "verbose": false }   // present only when configuration is declared; keys are configuration[].id
  }
}

content केवल text और image ब्लॉक स्वीकार करता है (छवि बेस64 data प्लस mimeType के रूप में); अन्य प्रकार हटा दिए जाते हैं। details मनमाना संरचित डेटा है जिसे मॉडल में कभी भी फीड नहीं किया जाता है; यह होस्ट यूआई रेंडरिंग और आपके स्वयं के डॉक किए गए दृश्यों के लिए है।

फ़ाइल परिणाम: फ़ाइल कार्ड

// When the result is a file: include the absolute path and file name. The session
// renders a clickable file card that previews in-app (docx/xlsx/pdf/markdown/code…).
process.send({
  type: 'tool_result',
  requestId,
  content: [{ type: 'text', text: `Generated [${fileName}](${filePath})` }],
  details: { filePath, fileName },
});

चेकलिस्ट रेंडरिंग: चेकलिस्ट के रूप में रेंडर करें

// For tools with renderAs: "checklist", the host renders the todos array from the call arguments:
{
  "todos": [
    { "id": "1", "content": "Initialize repository", "status": "completed" },
    { "id": "2", "content": "Write unit tests", "status": "in_progress" },
    { "id": "3", "content": "Publish", "status": "pending" }
  ]
}

अच्छा वर्णन लिख रहा हूँ

अनिवार्यता में ट्रिगर का वर्णन करें ("जब उपयोगकर्ता पूछे तो इसे कॉल करें...") और बहिष्करण बताएं ("इसके लिए इसे कॉल न करें...")। यदि परिणाम एक फ़ाइल है, तो मॉडल से यह दावा करने के बजाय कि यह उत्पन्न हुआ था, लौटाई गई फ़ाइल लिंक को संदर्भित करने के लिए कहें। यदि तर्क किसी बाहरी पीढ़ी के एपीआई को अग्रेषित किए जाते हैं, तो बताएं कि वे किस भाषा में होने चाहिए। "कार्य प्रबंधित करें" जैसे एक-पंक्ति वाले शब्दों से बचें; मॉडल को पता नहीं चलेगा कि टूल का उपयोग कब करना है।

06डॉक किए गए दृश्य (विचार)

डॉक किया गया दृश्य सत्र के दाएं साइडबार में एक स्थायी पृष्ठ है: सत्र टूलबार में एक अतिरिक्त आइकन दिखाई देता है और खोले जाने पर आपका HTML दाईं ओर दिखाई देता है। पृष्ठ स्थिति (स्क्रॉल स्थिति, ड्राफ्ट) स्विचिंग सत्र और ढहने/विस्तारित होने तक जीवित रहती है, वीएस कोड साइडबार दृश्य के समान ही शब्दार्थ।

मैदानविवरण
idप्लगइन के भीतर अद्वितीय.
titleआइकन के लिए टूलटिप टेक्स्ट (मानव पठनीय)।
iconहोस्ट अनुमति सूची में से चुनें: git-branch, checklist। पूरे ऐप में आइकन को एक समान रखता है; कस्टम छवियाँ स्वीकार नहीं की जातीं.
entryप्लगइन फ़ोल्डर के सापेक्ष HTML फ़ाइल।
widthपिक्सेल में वैकल्पिक डिफ़ॉल्ट पैनल चौड़ाई, 240 से 640, डिफ़ॉल्ट 360। उपयोगकर्ता आकार बदलने के लिए खींच सकते हैं और आकार याद रखा जाता है।

पेज रनटाइम

पेज एक सैंडबॉक्स में चलता है (sandbox + contextIsolation, कोई नोड नहीं, होस्ट ऐप डेटा तक कोई पहुंच नहीं) और केवल window.pluginHost पर कुछ तरीकों के माध्यम से अपनी प्लगइन प्रक्रिया से बात कर सकता है। अपनी खुद की शैलियाँ लाएँ; नीचे दिए गए उदाहरण के अनुसार ऐप की प्रकाश/अंधेरे योजना का पालन करने की अनुशंसा की जाती है।

interface PluginHost {
  // Call a tool declared in this plugin's manifest.tools; same call_tool channel the AI uses
  invoke(toolName: string, params: unknown): Promise<
    { content: unknown[]; details?: unknown } | { error: string }
  >;
  // Subscribe to ui_push messages from the plugin process; returns an unsubscribe function
  onPush(callback: (channel: string, payload: unknown) => void): () => void;
  // Current light/dark scheme and subsequent changes
  getColorScheme(): Promise<'light' | 'dark'>;
  onColorSchemeChange(callback: (scheme: 'light' | 'dark') => void): () => void;
}
declare const pluginHost: PluginHost; // exposed as window.pluginHost

अनुशंसित पैटर्न: पहले लोड पर invoke() के साथ अपने स्वयं के क्वेरी टूल में से एक को कॉल करें और इसे details में संरचित डेटा लौटाएं; बाद में मतदान के बजाय प्लगइन प्रक्रिया से प्रत्येक परिवर्तन को ui_push से पुश करें। जब AI बातचीत में डेटा बदलता है, तो पैनल तुरंत रीफ्रेश हो जाता है।

07फ़्लोटिंग पैनल (यूआई)

ui: { entry, title } एक स्टैंडअलोन फ़्लोटिंग विंडो (900×700) घोषित करता है जिसे उपयोगकर्ता प्लगइन सूची में "⋯" मेनू से खोलते हैं; निकट आने पर यह नष्ट हो जाता है। पृष्ठ परिवेश और window.pluginHost एपीआई डॉक किए गए दृश्यों के समान हैं, और ui_push फ़्लोटिंग पैनल और डॉक किए गए दृश्यों दोनों पर वितरित किया जाता है। कभी-कभी खोले जाने वाले बड़े पैनलों के लिए उपयुक्त; उस सामग्री के लिए views का उपयोग करें जो सत्र के बगल में रहना चाहिए।

08सत्र टूलबार आइकन (सत्रक्रिया)

प्रति प्लगइन अधिकतम एक स्थायी आइकन। इसे क्लिक करने से खाली तर्कों के साथ tool कॉल आती है, इसलिए उस टूल को पैरामीटर के बिना कुछ सार्थक करना होगा।

मैदानविवरण
toolक्लिक पर कॉल करने का टूल.
iconअनुमतिप्राप्त आइकन नाम.
tooltipपाठ पर होवर करें.
visibleToolवैकल्पिक। जब सेट किया जाता है, तो इसे रेंडर करने से पहले खाली तर्कों के साथ कॉल किया जाता है और परिणाम में बूलियन details.visible तय करता है कि आइकन दिखता है या नहीं। रनटाइम जांच के लिए उपयोगी जैसे "क्या वर्तमान फ़ोल्डर एक गिट रिपॉजिटरी है"।
// The host calls visibleTool with empty params and shows the icon based on details.visible
process.send({
  type: 'tool_result',
  requestId,
  content: [{ type: 'text', text: isGitRepo ? 'git repo' : 'not a git repo' }],
  details: { visible: isGitRepo },
});

09सेटिंग्स (कॉन्फ़िगरेशन)

घोषित प्रविष्टियाँ सेटिंग पृष्ठ पर प्लगइन कॉन्फ़िगरेशन के अंतर्गत दिखाई देती हैं। होस्ट उपयोगकर्ता द्वारा बदले गए मानों को संग्रहीत करता है और उन्हें प्रत्येक call_tool पर context.config के रूप में पास करता है (id द्वारा कुंजीबद्ध, defaultValue पर वापस आता है), चाहे कॉल एआई, टूलबार आइकन या आपके पैनल से आती है। आपको उनसे कभी भी पूछने की आवश्यकता नहीं है।

typeके रूप में प्रस्तुत किया गयाडिफॉल्टवैल्यू प्रकार
selectएकल-विकल्प सूची; विकल्प optionsTool से आते हैंstring
booleanगिल्ली टहनीboolean
stringटेक्स्ट इनपुट, ब्लर पर प्रतिबद्धstring
numberसंख्या इनपुटnumber
// For type: "select" settings, the host calls optionsTool with empty params to fetch options
process.send({
  type: 'tool_result',
  requestId,
  content: [{ type: 'text', text: '2 options' }],
  details: {
    options: [
      { value: 'fast', label: 'Fast' },
      { value: 'accurate', label: 'Accurate' },
    ],
  },
});
// The host automatically prepends an "Auto" option whose value equals this
// configuration entry's defaultValue; the plugin must not return it again.

10कमांड पैलेट/शॉर्टकट/संदर्भ मेनू

"खाली तर्कों के साथ एक टूल को कॉल करें" के लिए तीनों अलग-अलग प्रवेश बिंदु हैं; एक प्लगइन कई घोषित कर सकता है।

मैदानआकारविवरण
commands{ tool, icon, title }[]Ctrl/Cmd+K कमांड पैलेट में दिखाया गया है और उपयोगकर्ता द्वारा इसे खोजने के बाद ट्रिगर किया गया है।
keybindings{ command, key }[]command को commands[] में एक प्रविष्टि के tool के बराबर होना चाहिए। key mod+shift+g नोटेशन का उपयोग करता है, जहां mod macOS पर Cmd है और अन्यत्र Ctrl है। अन्य शॉर्टकट्स के साथ टकराव की सांख्यिकीय रूप से जाँच नहीं की जाती है, इसलिए असामान्य संयोजन चुनें।
menus{ "session/context": { tool, icon, title }[] }सत्र पंक्ति पर मेनू में जोड़ा गया. अभी केवल यही स्थान उपलब्ध है.

11दस्तावेज़ पार्सर्स (दस्तावेज़ पार्सर्स)

जब उपयोगकर्ता किसी फ़ाइल को इनपुट बॉक्स में छोड़ता है, तो होस्ट MIME प्रकार द्वारा सक्षम प्लगइन्स द्वारा घोषित पार्सर्स को देखता है और फ़ाइल सामग्री को आधार 64 के रूप में मिलान toolName पर भेजता है। यह वह टूल नहीं है जिसे AI कॉल करने का निर्णय लेता है, इसलिए not को tools के अंतर्गत पार्सर टूल को भी सूचीबद्ध करें, अन्यथा इसे AI-कॉल करने योग्य टूल के रूप में प्रदर्शित किया जाएगा।

// The toolName declared in documentParsers is called when the user drops a file into the input:
// params = { base64: "<file content as base64>" }
// Return: details must be { success: true, text } or { success: false, reason }
process.on('message', (msg) => {
  if (msg.type !== 'call_tool' || msg.toolName !== 'parse_markdown') return;
  const text = Buffer.from(msg.params.base64, 'base64').toString('utf8');
  process.send({
    type: 'tool_result',
    requestId: msg.requestId,
    content: [{ type: 'text', text: 'parsed' }],
    details: { success: true, text },
  });
});

12रिवर्स आरपीसी (host_request)

प्लगइन प्रक्रिया में कोई इलेक्ट्रॉन एपीआई नहीं है। जब इसे वास्तविक सिस्टम क्षमता की आवश्यकता होती है तो यह होस्ट को host_request भेजता है, जो host_response या host_error के साथ उत्तर देता है। यह चैनल call_tool से पूर्णतः स्वतंत्र है; आप टूल कॉल को संभालते समय या टाइमर से इसका उपयोग कर सकते हैं।

capabilityparamsresultशर्त लगाना
show_notification{ title, body?, viewId? }{ shown: true } / { shown: false, reason: "disabled" | "unsupported" }notifications अनुमति की आवश्यकता है। जब उपयोगकर्ता सेटिंग्स में डेस्कटॉप नोटिफिकेशन बंद कर देता है तो त्रुटि के बजाय अक्षम लौटाता है। जब viewId आपके डॉक किए गए दृश्यों में से किसी एक को इंगित करता है, तो अधिसूचना पर क्लिक करने से ऐप सामने आ जाता है और उस दृश्य का विस्तार होता है।
render_pdf{ outputPath, title, content }{}सामग्री मार्कडाउन है; होस्ट अपने अंतर्निर्मित रेंडरर के साथ आउटपुटपाथ पर एक पीडीएफ प्रस्तुत करता है।
const crypto = require('crypto');
const pending = new Map();

function requestHost(capability, params) {
  const requestId = crypto.randomUUID();
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      pending.delete(requestId);
      reject(new Error(`host capability "${capability}" timed out`));
    }, 30_000);
    pending.set(requestId, { resolve, reject, timer });
    process.send({ type: 'host_request', requestId, capability, params });
  });
}

process.on('message', (msg) => {
  if (msg.type === 'host_response' || msg.type === 'host_error') {
    const p = pending.get(msg.requestId);
    if (!p) return;
    pending.delete(msg.requestId);
    clearTimeout(p.timer);
    if (msg.type === 'host_error') p.reject(new Error(msg.message));
    else p.resolve(msg.result);
  }
});

// usage
await requestHost('show_notification', {
  title: '3 todos for today',
  body: '• Write weekly report\n• Reply to emails',
  viewId: 'board',      // optional: expand this docked view when the notification is clicked
});
// => { shown: true } or { shown: false, reason: 'disabled' | 'unsupported' }

await requestHost('render_pdf', {
  outputPath: '/abs/path/report.pdf',
  title: 'Report',
  content: '# Title\n\nBody (Markdown)',
});

13जीवन चक्र

अवस्थाव्यवहार
शुरूडिफ़ॉल्ट रूप से आलसी: ऐप के साथ शुरू नहीं हुआ, आपके किसी टूल (एआई, टूलबार आइकन, पैनल, कमांड, दस्तावेज़ पार्सिंग) में पहली कॉल पर फोर्क किया गया। ऐप लॉन्चिंग समाप्त होने के ठीक बाद activationEvents: ["onStartupFinished"] शुरू होने की घोषणा करने वाले प्लगइन्स; इसका उपयोग केवल उन प्लगइन्स के लिए करें जिन्हें बैकग्राउंड टाइमर (रिमाइंडर, पोलिंग) की आवश्यकता होती है, सामान्य टूल प्लगइन्स के लिए नहीं।
निवासीएक बार शुरू होने के बाद प्रक्रिया सक्रिय रहती है और टूल कॉल में इसका पुन: उपयोग किया जाता है। आप मेमोरी में स्थिति को कैश कर सकते हैं, लेकिन मान लें कि इसे किसी भी समय पुनः आरंभ किया जा सकता है।
टकरा जानायदि प्रक्रिया अप्रत्याशित रूप से समाप्त हो जाती है तो होस्ट इसे पुनः आरंभ करता है: तुरंत, फिर 5 और 15 सेकंड के बाद। लगातार 3 विफलताओं के बाद इसे "क्रैश" के रूप में चिह्नित किया जाता है और अब दोबारा प्रयास नहीं किया जाता है; उपयोगकर्ता प्लगइन पेज पर स्थिति देखते हैं। इन-फ़्लाइट सभी रिटर्न त्रुटियों को कॉल करता है।
अक्षम/अनइंस्टॉल/पुनः इंस्टॉल करेंप्रक्रिया समाप्त हो गई है और डॉक किए गए दृश्य और फ्लोटिंग पैनल नष्ट हो गए हैं; पुनः स्थापित करने से पूरा फ़ोल्डर बदल जाता है।
लॉग्सआपका stdout/stderr प्लगइन आईडी के साथ उपसर्ग वाली ऐप लॉग फ़ाइल में लिखा जाता है। डिबगिंग के लिए सादा console.log पर्याप्त है; "डिबगिंग एवं FAQ" देखें।
ईएनवी
चाइल्ड प्रक्रिया ELECTRON_RUN_AS_NODE=1 से शुरू होती है, cwd प्लगइन इंस्टॉल फ़ोल्डर है, और नोड संस्करण ऐप के साथ बंडल किए गए इलेक्ट्रॉन से मेल खाता है। विश्व स्तर पर स्थापित किसी भी पैकेज पर निर्भर न रहें और यह न मानें कि npx मौजूद है।

14पैकेजिंग एवं प्रकाशन

पैकेजिंग

आर्काइव रूट पर manifest.json के साथ प्लगइन फ़ोल्डर को ज़िप करें। यदि आपके पास तृतीय-पक्ष निर्भरताएँ हैं, तो पूरे node_modules को शिपिंग करने के बजाय पहले उन्हें esbuild/webpack के साथ एक फ़ाइल में बंडल करें।

my-plugin.zip
├── manifest.json     # must be at the archive root
├── icon.png          # optional, referenced by manifest.icon
├── index.js
├── view.html
└── node_modules/…    # include dependencies if any (bundling into a single file is recommended)

बाज़ार में प्रकाशन

AnBoWork → टूल्स → प्लगइन्स → "मार्केटप्लेस" टैब → ऊपरी दाएं कोने में "प्लगइन प्रकाशित करें", फिर ज़िप अपलोड करें। सबमिशन समीक्षा में प्रवेश करते हैं, जो जांचता है कि मैनिफ़ेस्ट घोषणा कोड (विशेष रूप से अनुमतियाँ) से मेल खाती है। एक बार स्वीकृत होने के बाद, अन्य उपयोगकर्ता इसे बाज़ार में ढूंढ और इंस्टॉल कर सकते हैं, और एआई आवश्यकता पड़ने पर स्वचालित रूप से उपयोगकर्ताओं के लिए सत्यापित प्लगइन्स इंस्टॉल कर सकता है।

अपडेट

टक्कर version और फिर से प्रकाशित करें। ऐप इंस्टॉल किए गए संस्करण की तुलना मार्केटप्लेस संस्करण से करता है और अपडेट करने का संकेत देता है; पुनः स्थापित करने से उपयोगकर्ता की सक्षम स्थिति और सेटिंग्स मान बने रहते हैं।

15पूर्ण उदाहरण: टोडो क्वाड्रंट

एक वास्तविक, कार्यशील प्लगइन (छंटाई की गई): एआई सभी चीजों को जोड़ और हटा सकता है, दायां साइडबार एक बोर्ड दिखाता है जो वास्तविक समय में ताज़ा होता है, और यह सिस्टम अधिसूचना अनुस्मारक भेज सकता है। इन तीनों को चेन करने से टूल प्रोटोकॉल, डॉक्ड-व्यू पुश और रिवर्स आरपीसी शामिल हो जाते हैं।

{
  "id": "local.todo-quadrant",
  "name": "Todo Quadrant",
  "version": "1.2.0",
  "description": "Daily todo list organized by the Eisenhower matrix. Install this whenever the user wants to track tasks or asks to be reminded about something…",
  "main": "index.js",
  "permissions": ["filesystem", "notifications"],
  "activationEvents": ["onStartupFinished"],
  "tools": [{
    "name": "manage_todo_quadrant",
    "summary": "Add, list, complete, delete and update todos in an urgent/important matrix",
    "description": "Manage the user's daily todo list… Actions: add / list / complete / delete / update / set_reminder / remind_now. add/update also accept remind_at to schedule a one-time reminder for that specific todo. Call this whenever the user talks about their todos…",
    "parameters": {
      "type": "object",
      "properties": {
        "action": { "type": "string", "enum": ["add", "list", "complete", "delete", "update", "set_reminder", "remind_now"] },
        "id": { "type": "string" },
        "content": { "type": "string" },
        "quadrant": { "type": "string", "enum": ["urgent_important", "important_not_urgent", "urgent_not_important", "not_urgent_not_important"] },
        "due_date": { "type": "string", "description": "YYYY-MM-DD" },
        "remind_at": { "type": "string", "description": "YYYY-MM-DD HH:MM — a one-time reminder for this todo, independent of the daily digest" }
      },
      "required": ["action"]
    }
  }],
  "views": [{ "id": "quadrant", "title": "Todo Quadrant", "icon": "checklist", "entry": "view.html", "width": 380 }]
}

16डिबगिंग और अक्सर पूछे जाने वाले प्रश्न

लक्षणकारण और निवारण
इंस्टॉल पर मेनिफेस्ट सत्यापन विफल हो जाता हैजैसा कि संदेश इंगित करता है, "मैनिफ़ेस्ट फ़ील्ड्स" तालिका के सामने प्रत्येक फ़ील्ड की जाँच करें: आईडी प्रारूप, मुख्य/प्रविष्टि में .. नहीं होना चाहिए, आइकन को अनुमति दी जानी चाहिए, कीबाइंडिंग कमांड को कमांड में मौजूदा टूल को इंगित करना चाहिए, चौड़ाई 240 और 640 के बीच होनी चाहिए।
एआई कभी भी मेरे टूल को कॉल नहीं करतालगभग हमेशा एक description समस्या: ट्रिगर अस्पष्ट है या यह अंग्रेजी में नहीं लिखा है। "अच्छा विवरण लिखना" देखें। यह भी जांचें कि टूल का नाम किसी अन्य टूल से न टकराए।
कॉल का समय समाप्त (30 सेकंड)प्रविष्टि स्क्रिप्ट ने tool_result का उत्तर नहीं दिया। आमतौर पर requestId की प्रतिध्वनि नहीं होती, संदेश type गलत लिखा जाता है, या स्क्रिप्ट स्टार्टअप पर फेंक दी जाती है और बाहर निकल जाती है। ऐप लॉग में [plugin:your-id] से पहले जुड़ी पंक्तियाँ देखें।
प्लगइन स्थिति "क्रैश्ड" दिखाती हैलगातार 3 असफल शुरुआत. आमतौर पर लापता पैकेज का require; प्लगइन फ़ोल्डर में node index.js चलाने से यह पुन: उत्पन्न होता है। ठीक करने के बाद, प्लगइन पेज पर प्लगइन को बंद करें और फिर से चालू करें।
पैनल खाली खुलता हैगलत entry पथ, या पृष्ठ पर JS त्रुटि। पेज बिना नोड के require के सैंडबॉक्स में चलता है; केवल 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
एपीआई एकीकरण दस्तावेज़ देखें