दस्तावेज़
प्लग-इन
एक्सटेंशन मेनिफ़ेस्ट, वर्कर-होस्ट एपीआई, सहायक उपकरण और अलग ब्राउज़र प्लगइन इंस्टॉलेशन अनुबंध।
अंग्रेज़ी से स्वचालित रूप से अनुवादित। अंग्रेज़ी मूल देखें
विस्तार सतह चुनें
@cadcamfun/plugin-sdk के साथ वर्कर प्लगइन अनुबंध को परिभाषित करता है plugin.json प्रकट और एपीआई संस्करण 1. इसका होस्ट क्षमता-नियंत्रित सेवाओं को उजागर करता है और Bun श्रमिकों में प्लगइन फ़ंक्शन चलाता है। उत्पादन सहायक लोडर वर्तमान में केवल अनुरोध करने वाले प्लगइन्स को स्वीकार करता है ai:tool.
The /api/plugins HTTP परिवार एक अलग ब्राउज़र-प्लगइन अनुबंध का उपयोग करता है: ज़िप पैकेज के साथ manifest.json, a main प्रविष्टि, ब्राउज़र अनुमतियाँ, कॉन्फ़िगरेशन और जावास्क्रिप्ट बूटस्ट्रैप। उस एपीआई के माध्यम से एक पैकेज स्थापित करने से यह एक वर्कर एसडीके प्लगइन नहीं बन जाता है। इच्छित एकीकरण से मेल खाते मैनिफ़ेस्ट और जीवनचक्र का उपयोग करें।
कार्यकर्ता एसडीके मेनिफेस्ट
{
"id": "com.example.shop-helper",
"name": "Shop helper",
"version": "1.0.0",
"apiVersion": "1",
"entry": "index.js",
"capabilities": ["ai:tool"],
"contributes": {
"aiTools": [{
"id": "lookup",
"description": "Look up the shop's documented inspection checklist.",
"kind": "read",
"parameters": { "type": "object", "properties": {} },
"entry": "lookup"
}]
}
} पहचानकर्ता रिवर्स-डीएनएस फॉर्म का उपयोग करते हैं, संस्करण अर्थपूर्ण है major.minor.patch एक वैकल्पिक प्रीरिलीज़ के साथ, और apiVersion होना ही चाहिए "1". प्रवेश पथ प्लगइन निर्देशिका से संबंधित हैं। योगदान कमांड, पैनल, पोस्ट-प्रोसेसर, संचालन और सहायक उपकरण घोषित कर सकते हैं; किसी योगदान की घोषणा करने से वह सुविधा हर होस्ट से जुड़ नहीं जाती।
स्कीमा वैकल्पिक की अनुमति देता है signature और dev खेत. वर्तमान वर्कर होस्ट इन मानों को रिकॉर्ड करता है लेकिन इंस्टॉल के दौरान क्रिप्टोग्राफ़िक हस्ताक्षर सत्यापन नहीं करता है। केवल हस्ताक्षर फ़ील्ड ही सत्यापित प्रकाशक का प्रमाण नहीं है।
मॉड्यूल प्रविष्टि और एआई फ़ंक्शन
definePlugin एक मेनिफेस्ट और के साथ मॉड्यूल के लिए टाइप किया गया पहचान सहायक है activate(ctx). सक्रियण एक क्लीनअप फ़ंक्शन लौटा सकता है, और मॉड्यूल उजागर हो सकता है deactivate. एसडीके इन जीवनचक्र हुक का वर्णन करता है; उनकी उपलब्धता कंक्रीट वर्कर बूटस्ट्रैप पर निर्भर करती है, जैसा कि नीचे बताया गया है।
सहायक कार्यों को एक के माध्यम से निर्यात किया जाता है aiTools अभिलेख; योगदान का entry उस रिकॉर्ड में फ़ंक्शन को नाम दें। एक टूल योगदान में इसका विवरण, JSON पैरामीटर स्कीमा, और शामिल हैं read या write दयालु। एक लेखन उपकरण एम्बेडेड सहायक में एक मानव अनुमोदन अनुरोध के माध्यम से भेजा जाता है; एक बाहरी ब्रिज को केवल अनुमत रीड प्लगइन टूल ही प्राप्त होते हैं।
कार्यकर्ता प्रविष्टि को एक स्व-निहित मॉड्यूल के रूप में बंडल करें। वर्कर होस्ट प्रविष्टि स्रोत को पढ़ता है और इसे ब्लॉब मॉड्यूल के माध्यम से आयात करता है। नोड-शैली फ़ाइल सिस्टम लोडर मानने के बजाय सापेक्ष पैकेज या फ़ाइल आयात को एक अलग एकीकरण चिंता के रूप में मानें।
क्षमता-नियंत्रित एपीआई
SDK पहचानता है drawing:read, drawing:write, toolpath:read, storage, ui:panel, और ai:tool. ड्राइंग राइट का तात्पर्य ड्राइंग रीड से है। सामान्य होस्ट स्थापित मेनिफेस्ट से प्रभावी क्षमताएं प्राप्त करता है और उन्हें आरपीसी पर जांचता है; एम्बेडिंग एप्लिकेशन यह तय करता है कि वह कौन से मैनिफ़ेस्ट और सतहों को लोड करने के लिए तैयार है।
एसडीके संदर्भ ड्राइंग रीड्स और ऐड/अपडेट/रिमूवएंटिटी पैच, टूलपाथ/प्रोग्राम रीड्स, प्राइवेट स्ट्रिंग कुंजी-वैल्यू स्टोरेज, और घोषणात्मक कमांड/पैनल पंजीकरण को उजागर कर सकता है। लुप्त सेवाएँ संदर्भ से अनुपस्थित हैं। भंडारण कुंजियों का उपयोग plugin:<id>: नामस्थान और निरपेक्ष या पैरेंट-ट्रैवर्सल कुंजियाँ अस्वीकार करें।
उत्पादन सहायक लोडर ही समर्थन करता है ai:tool. ड्राइंग, टूलपाथ, स्टोरेज, या यूआई क्षमताओं के बारे में पूछने वाले मेनिफेस्ट को चेतावनी के साथ छोड़ दिया जाता है। यह उन सतहों को चुपचाप प्रदान नहीं करता है या उनकी व्यापक क्षमताओं को सहायक होस्ट में लोड नहीं करता है।
लोडिंग और श्रमिक जीवनचक्र
किसी सहायक एक्सटेंशन को सक्षम करने के लिए, उसे रखें plugin.json और नीचे बंडल प्रविष्टि <dataDir>/plugins/<id>/ और पहचानकर्ता को इसमें सूचीबद्ध करें <dataDir>/plugins/enabled.json, एक JSON सरणी। फ़ोल्डर पहचानकर्ता को मेनिफेस्ट से मेल खाना चाहिए। सहायक प्लगइन सेवा निर्मित होने के दौरान लोडिंग होती है; एक विफल प्लगइन एप्लिकेशन को रोके बिना एक चेतावनी लॉग करता है।
सामान्य होस्ट इंस्टॉल, सक्षम, अक्षम, अनइंस्टॉल, कमांड कॉल, एआई-टूल कॉल और कॉन्फ़िगरेशन संचालन के साथ स्थापित, सक्षम, अक्षम और दोषपूर्ण स्थितियों का समर्थन करता है। Enable एक वर्कर बनाता है और उसका बूटस्ट्रैप हैंडशेक पूरा करता है; अक्षम इसे फाड़ देता है। अनइंस्टॉल होस्ट की इंजेक्टेड निर्भरता के माध्यम से रजिस्ट्री स्थिति और स्टोरेज नेमस्पेस को हटा देता है।
कार्यकर्ता एक खाली वातावरण से शुरुआत करते हैं और बूटस्ट्रैप चयनित वैश्विक एपीआई को हटा देता है। यह एक एप्लिकेशन-स्तरीय प्रतिबंध है, ऑपरेटिंग-सिस्टम सैंडबॉक्स नहीं: Bun ग्लोबल्स पहुंच योग्य रहते हैं। केवल वही एक्सटेंशन कोड सक्षम करें जो एप्लिकेशन प्रक्रिया सीमा के अंदर चलने के लिए उपयुक्त हो।
रनटाइम सीमाएँ
होस्ट एक 256 एमबी वर्कर मेमोरी सेटिंग, एक 2,000-कॉल-प्रति-मिनट दर सीमा, और अधिकतम 64 लंबित कॉल प्रति प्लगइन परिभाषित करता है। कमांड टाइमआउट व्यवहार एम्बेडिंग होस्ट द्वारा प्रदान किया जाता है; सहायक लोडर 10 सेकंड का उपयोग करता है। एआई टूल कॉल की एक अलग समय सीमा होती है 30-सेकंड। टाइमआउट, अनुपस्थित उपकरण, कार्यकर्ता क्रैश, क्षमता विफलताएं, और कतार थकावट टाइप की गई होस्ट विफलताओं या पठनीय टूल परिणामों को लौटाती है।
दस मिनट के भीतर तीन क्रैश के बाद क्रैश ट्रैकिंग एक प्लगइन को ख़राब कर देती है। ये मेजबान बाध्य सहकारी आरपीसी और जीवनचक्र व्यवहार को नियंत्रित करते हैं; Bun को दी गई मेमोरी सेटिंग अलग से पृथक निष्पादन योग्य का विकल्प नहीं है।
सीमाओं को परिभाषित किया गया है apps/sidecar/src/plugins/host.ts: CALL_TIMEOUT_MS (5,000 एमएस प्रति सामान्य कॉल), AI_TOOL_TIMEOUT_MS (30,000 एमएस प्रति सहायक टूल कॉल), MEMORY_LIMIT_MB (256), CALL_RATE_LIMIT (2,000 कॉल प्रति प्लगइन प्रति मिनट), MAX_PENDING_CALLS (64), और CRASH_LIMIT (3 10-मिनट के भीतर क्रैश हो जाता है CRASH_WINDOW_MS, जिसके बाद प्लगइन स्वचालित रूप से अक्षम हो जाता है)।
ज़िप इंस्टालेशन और ब्राउज़र प्लगइन एपीआई
POST /api/plugins/install एक बहुखण्डीय संग्रह स्वीकार करता है। इंस्टॉलर पढ़ता है manifest.json ज़िप रूट या एकल शीर्ष-स्तरीय निर्देशिका से, ब्राउज़र-प्लगइन मैनिफ़ेस्ट को सत्यापित करता है, और इसकी फ़ाइलों को संग्रहीत करता है <dataDir>/storage/plugins/<id>/. ब्राउज़र का उपयोग प्रकट होता है main, engines.cadcam, और SDK के बजाय एक ब्राउज़र अनुमति सूची entry, apiVersion, और क्षमताएं।
GET /api/plugins उन स्थापित प्रविष्टियों को सूचीबद्ध करता है; विवरण, सक्षम/अक्षम, अनइंस्टॉल, अपडेट और कॉन्फ़िगरेशन एंडपॉइंट उनकी रजिस्ट्री पर काम करते हैं। /api/plugins/bootstrap.js?id=… जावास्क्रिप्ट परोसता है; /api/plugins/serve?id=…&file=… प्लगइन फ़ाइलें परोसता है। ये अपने घोषित सामग्री प्रकारों के साथ टेक्स्ट/बाइनरी ऑपरेशन हैं।
स्थानीय रजिस्ट्री ब्राउज़र नीचे पैकेज मेटाडेटा पढ़ता है <dataDir>/plugins-registry. यह एक स्थानीय प्रकट सूची है. पुरालेख स्थापना, रजिस्ट्री लिस्टिंग और कार्यकर्ता सहायक एक्सटेंशन लोडिंग अलग-अलग ऑपरेशन हैं।
एसडीके सहायक
effectiveCapabilities, hasCapability, और missingCapabilities समर्थन क्षमता निरीक्षण. requireCapability अनुरोधित संदर्भ सतह अनुपस्थित होने पर क्षमता त्रुटि उत्पन्न होती है। storageNamespace और storageKey नामांकित कुंजियाँ बनाएँ; parseManifest jSON को मान्य करता है; manifestKey एक आईडी/संस्करण जोड़ी को प्रारूपित करता है।
कार्यान्वयन प्रवेश बिंदु
packages/plugin-sdk/src सार्वजनिक मेनिफेस्ट, क्षमता, संदर्भ, प्लगइन और टेस्ट-होस्ट एपीआई का मालिक है। apps/sidecar/src/plugins/host.ts कार्यकर्ता जीवनचक्र और आरपीसी का मालिक है; services/ai-plugins.ts सहमति-फ़ाइल लोडिंग और सहायक पंजीकरण का स्वामी है। ब्राउज़र इंस्टालेशन कार्यान्वित किया गया है http/plugins.ts और repos/plugin-registry-repo.ts.
विस्तार समीक्षा
योगदान स्कीमों को सटीक रखें, छोटे संरचित परिणाम लौटाएँ, और पढ़ने/लिखने के व्यवहार को ईमानदारी से घोषित करें। वास्तविक एम्बेडिंग होस्ट के विरुद्ध परीक्षण करें: एसडीके उपलब्धता ड्राइंग, स्टोरेज, यूआई, या पोस्ट रजिस्ट्रियों तक उत्पादन पहुंच स्थापित नहीं करती है। स्टैंडअलोन निकल्ली प्लगइन एक HTTP एक्शन क्लाइंट है और इसका उद्देश्य वर्कर में लोड किए गए कोड से अलग है।
नमूना सहायक मॉड्यूल पूरा करें
The plugin.json उपरोक्त नामों का उदाहरण aiTools.lookup. यह तत्संबंधी स्व-निहित है index.js. शीर्ष-स्तरीय मॉड्यूल कोड आयात होने पर चलता है; घोषित लुकअप फ़ंक्शन कॉल करने पर चलता है।
export const aiTools = {
lookup: async () => ({
ok: true,
checklist: [
"Compare the drawing revision with the job traveller.",
"Record the measuring instrument and its calibration status.",
"Record each inspected dimension and the measured value."
]
})
} ये नमूना दुकान निर्देश हैं, अंतर्निहित निरीक्षण मानक नहीं। उन्हें उस सामग्री से बदलें जो आपके एक्सटेंशन के पास वास्तव में है। इस मॉड्यूल को अगली सेवा आरंभीकरण में स्वीकार करने के लिए, सक्षम फ़ाइल है:
["com.example.shop-helper"] रनिंग कैटलॉग प्लगइन और टूल आईडी से प्राप्त एक पहचानकर्ता को उजागर करता है। इसके माध्यम से खोजें GET /api/ai/actions; यह न मानें कि ब्राउज़र ज़िप रजिस्ट्री सहायक की सक्षम सूची है। एप्लिकेशन/सेवा को पुनः लोड करना उत्पादन सहमति फ़ाइल को दोबारा पढ़ने का विश्वसनीय तरीका है; इस लोडर द्वारा कोई फ़ाइल सिस्टम वॉचर कॉन्फ़िगर नहीं किया गया है।
स्रोत: apps/sidecar/src/services/ai-plugins.ts, packages/ai/src/tools/plugin-tool.ts, और apps/sidecar/test/ai-plugin-tools.test.ts.
तर्क स्कीमा और जीवनचक्र सीमाएँ
किसी टूल की स्थानीय आईडी लोअरकेस अक्षर से शुरू होनी चाहिए और इसमें लोअरकेस अक्षर, अंक या अंडरस्कोर होना चाहिए, जिसमें अधिकतम 40-वर्ण हो। विवरण में 10–2,000 अक्षर होते हैं। योगदान में एक गैर-रिक्त प्रविष्टि फ़ंक्शन और JSON पैरामीटर स्कीमा का नाम होना चाहिए। एप्लिकेशन एडाप्टर कार्यकर्ता को कॉल करने से पहले तर्कों को मान्य करता है; एक इनकार एक संरचित वापसी कर सकता है ok: false प्लगइन को समाप्त किए बिना परिणाम।
सार्वजनिक SDK वर्णन करता है activate, सफ़ाई, और deactivate प्रवेश स्थल। वर्तमान Bun वर्कर बूटस्ट्रैप के सक्रिय/निष्क्रिय आरपीसी हैंडलर जीवनचक्र संदेशों को स्वीकार करते हैं लेकिन उन निर्यातित मॉड्यूल फ़ंक्शंस को लागू नहीं करते हैं। इसलिए सहायक एक्सटेंशन को अपना कॉल करने योग्य व्यवहार डालना चाहिए aiTools और सेटअप या क्लीनअप के लिए एसडीके सक्रियण कॉलबैक पर निर्भर रहने से बचें।
सामान्य वर्कर बूटस्ट्रैप में प्लेसहोल्डर ड्राइंग/टूलपाथ/यूआई हैंडलर भी शामिल होते हैं। वे उत्पादन ड्राइंग या यूआई एकीकरण का गठन नहीं करते हैं। सहायक लोडर का प्रतिबंध ai:tool इन असमर्थित सतहों को कार्यशील एप्लिकेशन एक्सेस के रूप में विज्ञापित होने से रोकता है।
स्रोत: packages/plugin-sdk/src/manifest.ts, plugin.ts, apps/sidecar/src/plugins/host.ts (PLUGIN_BOOTSTRAP), और services/ai-plugins.ts.
किसी गुम या असफल एक्सटेंशन का निदान करें
- कैटलॉग में कोई उपकरण नहीं: मान्य सक्षम JSON, सटीक फ़ोल्डर/मैनिफ़ेस्ट आईडी मिलान, मेनिफेस्ट डिकोडिंग और जांचें
ai:toolक्षमता. छोड़े गए प्लगइन के लिए स्टार्टअप चेतावनी पढ़ें। - प्रकट अनुरोध असमर्थित सतहें: असमर्थित क्षमताओं को केवल तभी हटाएँ जब कोड को वास्तव में उनकी आवश्यकता न हो। एक सहायक प्लगइन केवल घोषणा करके ड्राइंग-राइट एक्सेस प्राप्त नहीं कर सकता है।
- नोसुचटूल: बनाना
contributes.aiTools[].entryके अंतर्गत एक निर्यातित फ़ंक्शन का मिलान करेंaiTools. योगदान आईडी और प्रविष्टि नाम अलग-अलग उद्देश्यों की पूर्ति करते हैं। - तर्क सत्यापन विफलता: jSON स्कीमा और आवश्यक फ़ील्ड का निरीक्षण करें। निष्पादन से पहले गलत मानों को अस्वीकार कर दिया जाता है, जैसा कि वास्तविक-कार्यकर्ता और एप्लिकेशन एकीकरण परीक्षणों द्वारा प्रदर्शित किया गया है।
- समयबाह्य या दोषपूर्ण स्थिति: अवरुद्ध कार्य, अनसुलझे वादे, या क्रैश की जांच करें; बार-बार क्रैश होने से प्लगइन ख़राब हो जाता है। कारण ठीक करने के बाद ही पुनः सक्षम करें।
- ज़िप इंस्टॉलर मैनिफ़ेस्ट को अस्वीकार करता है: ब्राउज़र-प्लगइन का उपयोग करें
manifest.jsonउस समापन बिंदु के लिए अनुबंध। एक कार्यकर्ता का नाम बदलनाplugin.jsonअपने क्षेत्रों का अनुवाद नहीं करता.
स्रोत: apps/sidecar/test/plugins-ai-tools.test.ts, ai-plugin-tools.test.ts, plugins-http.test.ts, और src/plugins/host.ts.
प्रकट संदर्भ
प्रत्येक प्लगइन एक शिप करता है plugin.json. parseManifest(json) इसे एक चरण में पार्स और मान्य करता है, JSON सिंटैक्स त्रुटि को स्कीमा त्रुटि के समान त्रुटि चैनल में बदल देता है, इसलिए एक इंस्टॉल स्क्रीन को केवल एक विफलता प्रकार को संभालने की आवश्यकता होती है।
| मैदान | नियम |
|---|---|
id | रिवर्स-डीएनएस पहचानकर्ता: उदाहरण के लिए, कम से कम दो बिंदु-पृथक लेबल में 3–128 अक्षर, लोअरकेस अक्षर, अंक और हाइफ़न com.example.gear-generator. |
name | गैर-रिक्त प्रदर्शन नाम. |
version | major.minor.patch, वैकल्पिक रूप से इसके बाद प्री-रिलीज़ प्रत्यय जैसे -beta.1. |
apiVersion | स्ट्रिंग होनी चाहिए "1"; यह एकमात्र प्लगइन एपीआई संस्करण है। |
entry | प्लगइन फ़ोल्डर से संबंधित ईएस मॉड्यूल पथ। |
capabilities | क्षमता स्ट्रिंग्स की श्रृंखला (नीचे देखें)। बंद सूची के बाहर की कोई भी चीज़ एक प्रकट त्रुटि है। |
contributes | वैकल्पिक commands, panels, postProcessors, operations, और aiTools. |
signature | संग्रह हैश पर संपादित 25519 हस्ताक्षर; पैकेज्ड इंस्टॉल के लिए आवश्यक. |
dev | true एक स्थानीय विकास प्लगइन को चिह्नित करता है: हस्ताक्षर जांच छोड़ दी जाती है और यूआई एक बैज दिखाता है। |
| योगदान | खेत |
|---|---|
commands[] | id, title, वैकल्पिक keybinding जैसे कि Mod+Shift+G. |
panels[] | id, title, entry: एक निर्यातित फ़ंक्शन जो पैनल का घोषणात्मक वृक्ष लौटाता है। DOM एक्सेस कभी नहीं होता. |
postProcessors[] | id, title, entry: एक निर्यातित (program, options) => string समारोह। |
operations[] | id, title, entry: एक पैरामीटर के साथ एक निर्यातित रिकॉर्ड schema और एक शुद्ध generate(params, geometry, tool, stock) जो एक टूलपाथ लौटाता है। |
aiTools[] | id मेल मिलाना ^[a-z][a-z0-9_]{0,39}$, description (10–2,000 अक्षर; मॉडल इसे पढ़ता है), kind read या write, parameters (तर्कों की JSON स्कीमा), और entry. |
सहायक: manifestKey(m) रिटर्न id@version; requestedCapabilities(m) प्रदर्शन के लिए क्रमबद्ध क्षमता सूची लौटाता है; isDevPlugin(m) और isSigned(m) इंस्टॉल-नीति प्रश्नों का उत्तर दें.
क्षमताएं और प्लगइन संदर्भ
क्षमताएं ही एकमात्र ऐसी चीज है जिसके माध्यम से एक प्लगइन कार्य कर सकता है। मेनिफेस्ट घोषित करता है कि प्लगइन को क्या चाहिए, उपयोगकर्ता एक सबसेट प्रदान करता है, और होस्ट एक संदर्भ बनाता है जिसमें बिल्कुल दी गई सतहें शामिल होती हैं। प्रत्येक सतह प्रकार में वैकल्पिक है, इसलिए एक गुम क्षमता मूक नो-ऑप बनने के बजाय संकलन समय और रनटाइम दोनों पर दिखाई देती है।
| क्षमता | प्रसंग सतह | की अनुमति देता है | तात्पर्य |
|---|---|---|---|
drawing:read | ctx.drawing.read() | खुली हुई ड्राइंग पढ़ें (या undefined जब कोई भी खुला न हो)। | — |
drawing:write | ctx.drawing.patch(patch) | आवेदन करना AddEntity, UpdateEntity, या RemoveEntity पैच; नया संशोधन लौटाता है। | drawing:read |
toolpath:read | ctx.toolpath.list(), .program(id) | टूलपाथ और जी-कोड प्रोग्राम पढ़ें। | — |
storage | ctx.storage | नामांकित कुंजी-मान स्ट्रिंग: get, set, delete, keys. | — |
ui:panel | ctx.ui | registerCommand और registerPanel (केवल घोषणात्मक)। | — |
ai:tool | कोई नहीं (प्रकट योगदान) | सहायक को उपकरण प्रदान करें और, केवल-पढ़ने के लिए, एक स्टैंडअलोन निक्ली को। | — |
effectiveCapabilities(granted) निहितार्थों का समाधान करता है, इसलिए एक प्लगइन जो घोषित करता है drawing:write घोषित करने की आवश्यकता नहीं है drawing:read. हर सन्दर्भ में भी है pluginId, सुलझ गया capabilities, और ए log साथ debug, info, warn, और error; होस्ट प्लगइन आईडी के साथ लॉग लाइनों को उपसर्ग करता है। उपयोग requireCapability(ctx, capability, surface) एक सतह प्राप्त करने के लिए या एक के साथ असफल होने के लिए CapabilityError वह लापता अनुदान का नाम देता है।
एसडीके परीक्षण होस्ट के साथ एक प्लगइन का परीक्षण करें
createTestHost साइडकार के समान क्षमता नियमों के साथ इन-मेमोरी होस्ट बनाता है। केवल दी गई क्षमताएं ही संदर्भ में दिखाई देती हैं, और आप एक ड्राइंग, टूलपाथ और प्रोग्राम की आपूर्ति कर सकते हैं। नीचे दिया गया उदाहरण पूर्ण है और इसके साथ चलता है bun कार्यक्षेत्र में.
import { cad } from "@cadcamfun/core"
import { createTestHost, definePlugin, requireCapability, testManifest } from "@cadcamfun/plugin-sdk"
const manifest = testManifest({
id: "com.example.frame",
capabilities: ["drawing:write", "storage", "ui:panel"],
})
const plugin = definePlugin({
manifest,
activate(ctx) {
const drawing = requireCapability(ctx, "drawing:write", "drawing")
ctx.ui?.registerCommand({ id: "frame.add", title: "Add frame line" })
ctx.storage?.set("runs", "1")
drawing.patch({
_tag: "AddEntity",
entity: { ...cad.baseEntity("frame-1"), _tag: "Line",
start: { x: 0, y: 0 }, end: { x: 100, y: 0 } },
}) // returns revision 1
return () => ctx.log.info("teardown") // runs on deactivation
},
})
const host = createTestHost({ manifest, drawing: cad.emptyDrawing("d1", "Demo") })
const stop = await host.activate(plugin)
host.drawing()?.entities.length // 1
host.context.storage?.get("runs") // "1"
host.ui.commands // [{ id: "frame.add", title: "Add frame line" }]
await stop()
// Without the grant, requireCapability throws:
const denied = createTestHost({ manifest, granted: ["storage"] })
await denied.activate(plugin)
// CapabilityError: Plugin com.example.frame may not use "drawing:write":
// it was not granted at install time testManifest(overrides)न्यूनतम वैध मैनिफेस्ट से शुरू होता है (com.example.test-plugin, संस्करण 1.0.0, एपीआई 1, प्रविष्टिindex.js, कोई क्षमता नहीं)।grantedमेनिफेस्ट में जो कुछ भी माँगा गया है, उसके लिए डिफ़ॉल्ट है। अस्वीकृत पथों का परीक्षण करने के लिए एक छोटी सूची पास करें।host.storageहोस्ट बनाए जाने पर लिया गया एक स्नैपशॉट है। के माध्यम से लाइव मूल्यों को पढ़ेंhost.context.storage.host.on(commandId, handler)औरhost.invoke(commandId, args)पंजीकृत आदेशों का प्रयोग करें।runPostProcessorकिसी प्रोग्राम के विरुद्ध योगदान किया गया पोस्ट चलाता है, औरkeyOf(pluginId, key)नामांकित भंडारण कुंजी दिखाता है ताकि परीक्षण अलगाव पर जोर दे सकें।
एप्लिकेशन सहायक प्लगइन्स को कैसे लोड करता है
- स्टार्टअप पर साइडकार पढ़ता है
<data dir>/plugins/enabled.json, प्लगइन आईडी की एक JSON सरणी। जब तक वह वहां सूचीबद्ध न हो तब तक कुछ भी लोड नहीं किया जाता है। - प्रत्येक आईडी के लिए यह पढ़ता है
<data dir>/plugins/<id>/plugin.jsonऔर इसे पार्स करता है। फ़ोल्डर का नाम मेनिफेस्ट के बराबर होना चाहिएid. - केवल
ai:toolइस होस्ट में वायर्ड है. एक मेनिफेस्ट जो ड्राइंग, टूलपाथ, स्टोरेज, या यूआई एक्सेस मांगता है उसे उन सतहों से लोड करने के बजाय चेतावनी के साथ छोड़ दिया जाता है जो चुपचाप कुछ नहीं करेंगे। - प्लगइन एक वर्कर होस्ट में स्थापित और सक्षम है। एक प्लगइन जो लॉग लोड करने में विफल रहता है
Plugin <id> was not loaded: ...और एप्लिकेशन को प्रारंभ होने से कभी नहीं रोकता है। - प्रत्येक योगदानित उपकरण सहायक को इस प्रकार पेश किया जाता है
plugin_<slug of plugin id>_<tool id>, अधिकतम 80 वर्णों पर, जहां स्लग आईडी को छोटा कर देता है और अन्य वर्णों को अंडरस्कोर से बदल देता है।com.example.bolt-circleउपकरण के साथbolt_circleबन जाता हैplugin_com_example_bolt_circle_bolt_circle. - कार्यकर्ता द्वारा देखे जाने से पहले टूल की JSON स्कीमा के विरुद्ध तर्कों को मान्य किया जाता है। यदि स्कीमा 20,000 वर्णों से अधिक है, ऑब्जेक्ट स्कीमा नहीं है, या परिवर्तित नहीं किया जा सकता है, तो होस्ट किसी भी ऑब्जेक्ट को स्वीकार करता है और प्लगइन को मान्य करना होगा।
- एक कॉल जो थ्रो हो जाती है, टाइम आउट हो जाती है, या प्लगइन गायब हो जाता है, वापस लौट आती है
{ ok: false, error }(त्रुटि पाठ 500 वर्णों तक) मोड़ को क्रैश करने के बजाय सहायक को। एwriteप्रत्येक कॉल से पहले व्यक्ति के साथ टूल की पुष्टि की जाती है, चाहे उसके तर्क कुछ भी कहें।
ऑपरेटिंग-सिस्टम सैंडबॉक्स नहीं
कार्यकर्ता के पास अपनी कोई प्रक्रिया, फ़ेच या फ़ाइल हैंडल नहीं है, लेकिन Bun ग्लोबल्स इसके अंदर पहुंच योग्य रहते हैं। केवल उन्हीं प्लगइन्स को सक्षम करें जिनके कोड पर आपको भरोसा है, और लिखने वाले टूल को न्यूनतम रखें।
पहचानकर्ता और संस्करण नियम, परीक्षण किया गया
| कीमत | वैध? | नियम |
|---|---|---|
com.example.gear-generator | हाँ | रिवर्स-डीएनएस: अक्षरों, अंकों और के निचले-केस खंड -, कम से कम दो, 3–128 अक्षर |
a.b | हाँ | दो एक-अक्षर वाले खंड पर्याप्त हैं |
gear | नहीं | कम से कम एक बिंदु की आवश्यकता है |
Com.Example.x | नहीं | अपर केस की अनुमति नहीं है |
com.example_x.y | नहीं | अंडरस्कोर की अनुमति नहीं है |
| संस्करण | वैध? |
|---|---|
1.0.0 | हाँ |
1.2.3-beta.1 | हाँ |
1.0 | नहीं: तीन नंबर आवश्यक हैं |
v1.0.0 | नहीं: कोई उपसर्ग नहीं |
apiVersion स्ट्रिंग होनी चाहिए "1", एकमात्र प्लगइन एपीआई प्रमुख जो मौजूद है। एआई टूल आईडी का मिलान होना चाहिए ^[a-z][a-z0-9_]{0,39}$ और सहायक को इस रूप में दिखाया जाता है plugin_<plugin>_<id>; विवरण 10–2,000 वर्ण होने चाहिए क्योंकि मॉडल उन्हें पढ़ता है।
योगदान के प्रकार
| चाबी | खेत | उद्देश्य |
|---|---|---|
commands | id, title, वैकल्पिक keybinding (e.g. Mod+Shift+G) | पैलेट में आदेश |
panels | id, title, entry | एक घोषणात्मक वृक्ष से प्रस्तुत पैनल, जिसका नाम फ़ंक्शन है, वापस आता है; कोई DOM एक्सेस नहीं |
postProcessors | id, title, entry | A (program, options) => string रनटाइम पर पोस्ट पंजीकृत |
operations | id, title, entry | एक निर्यातित { schema, generate } अभिलेख |
aiTools | id, description, kind पढ़ें|लिखें, parameters (JSON स्कीमा), entry | सहायक को दिए जाने वाले उपकरण; प्रत्येक कॉल से पहले एक राइट टूल की पुष्टि की जाती है |
अन्य प्रकट क्षेत्र: signature (संग्रह हैश पर एड25519, पैकेज्ड इंस्टॉल के लिए आवश्यक) और dev (स्थानीय विकास प्लगइन: हस्ताक्षर जांच छोड़ देता है और एक बैज दिखाता है)।
क्षमता संकल्प, परीक्षण किया गया
import { effectiveCapabilities, missingCapabilities, storageKey, requireCapability } from "@cadcamfun/plugin-sdk"
effectiveCapabilities(["drawing:write", "storage"])
// ["drawing:read", "drawing:write", "storage"] (write implies read; sorted)
missingCapabilities(["drawing:read", "toolpath:read", "ai:tool"], ["drawing:write"])
// ["toolpath:read", "ai:tool"]
storageKey("com.example.gear", "presets/m2") // "plugin:com.example.gear:presets/m2"
storageKey("com.example.gear", "../x")
// RangeError: storage key "../x" may not escape the plugin namespace (same for "/abs")
requireCapability(ctxWithoutDrawing, "drawing:read", "drawing")
// CapabilityError (_tag "CapabilityDenied"):
// Plugin com.example.gear may not use "drawing:read": it was not granted at install time | संदर्भ पर सतह | अनुमति मिलने पर प्रस्तुत करें | तरीकों |
|---|---|---|
drawing | drawing:read या drawing:write | read() → ड्राइंग या undefined; patch(p) → नया संशोधन, के साथ AddEntity, UpdateEntity, RemoveEntity पैच |
toolpath | toolpath:read | list(), program(toolpathId) |
storage | storage | get, set, delete, keys; स्ट्रिंग मान |
ui | ui:panel | registerCommand, registerPanel |
log | हमेशा | debug, info, warn, error |