- होम
- Documentation
- एक्सटेंशन
- एक्सटेंशन लोडिंग (TypeScript/JavaScript मॉड्यूल)
एक्सटेंशन लोडिंग (TypeScript/JavaScript मॉड्यूल)
यह दस्तावेज़ इस बात को कवर करता है कि कोडिंग एजेंट स्टार्टअप पर एक्सटेंशन मॉड्यूल (.ts/.js) को कैसे खोजता और लोड करता है।
यह gemini-extension.json मैनिफ़ेस्ट एक्सटेंशन को कवर नहीं करता (जो अलग से प्रलेखित हैं)।
यह सबसिस्टम क्या करता है
Section titled “यह सबसिस्टम क्या करता है”एक्सटेंशन लोडिंग मॉड्यूल एंट्री फ़ाइलों की एक सूची बनाता है, Bun के साथ प्रत्येक मॉड्यूल को इम्पोर्ट करता है, उसकी फ़ैक्ट्री को निष्पादित करता है, और लौटाता है:
- लोड किए गए एक्सटेंशन परिभाषाएँ
- प्रति-पथ लोड त्रुटियाँ (पूरे लोड को रोके बिना)
- एक साझा एक्सटेंशन रनटाइम ऑब्जेक्ट जो बाद में
ExtensionRunnerद्वारा उपयोग किया जाता है
प्राथमिक कार्यान्वयन फ़ाइलें
Section titled “प्राथमिक कार्यान्वयन फ़ाइलें”src/extensibility/extensions/loader.ts— पथ खोज + इम्पोर्ट/निष्पादनsrc/extensibility/extensions/index.ts— सार्वजनिक एक्सपोर्टsrc/extensibility/extensions/runner.ts— लोड के बाद रनटाइम/इवेंट निष्पादनsrc/discovery/builtin.ts— एक्सटेंशन मॉड्यूल के लिए नेटिव ऑटो-डिस्कवरी प्रोवाइडरsrc/config/settings.ts— मर्ज किए गएextensions/disabledExtensionsसेटिंग्स लोड करता है
एक्सटेंशन लोडिंग के इनपुट
Section titled “एक्सटेंशन लोडिंग के इनपुट”1) ऑटो-डिस्कवर किए गए नेटिव एक्सटेंशन मॉड्यूल
Section titled “1) ऑटो-डिस्कवर किए गए नेटिव एक्सटेंशन मॉड्यूल”discoverAndLoadExtensions() पहले डिस्कवरी प्रोवाइडर्स से extension-module कैपेबिलिटी आइटम माँगता है, फिर केवल प्रोवाइडर native आइटम रखता है।
प्रभावी नेटिव स्थान:
- प्रोजेक्ट:
<cwd>/.xcsh/extensions - उपयोगकर्ता:
~/.xcsh/agent/extensions
पथ रूट नेटिव प्रोवाइडर (SOURCE_PATHS.native) से आते हैं।
नोट्स:
- नेटिव ऑटो-डिस्कवरी वर्तमान में
.xcshआधारित है। - लेगेसी
.piअभी भीpackage.jsonमैनिफ़ेस्ट कीज़ (pi.extensions) में स्वीकृत है, लेकिन यहाँ नेटिव रूट के रूप में नहीं।
2) स्पष्ट रूप से कॉन्फ़िगर किए गए पथ
Section titled “2) स्पष्ट रूप से कॉन्फ़िगर किए गए पथ”ऑटो-डिस्कवरी के बाद, कॉन्फ़िगर किए गए पथ जोड़े और रिज़ॉल्व किए जाते हैं।
मुख्य सेशन स्टार्टअप पथ (sdk.ts) में कॉन्फ़िगर किए गए पथ स्रोत:
- CLI-प्रदत्त पथ (
--extension/-e, और--hookको भी एक्सटेंशन पथ के रूप में माना जाता है) - सेटिंग्स
extensionsऐरे (मर्ज किए गए ग्लोबल + प्रोजेक्ट सेटिंग्स)
ग्लोबल सेटिंग्स फ़ाइल:
~/.xcsh/agent/config.yml(याPI_CODING_AGENT_DIRके माध्यम से कस्टम एजेंट डायरेक्टरी)
प्रोजेक्ट सेटिंग्स फ़ाइल:
<cwd>/.xcsh/settings.json
उदाहरण:
extensions: - ~/my-exts/safety.ts - ./local/ext-pack{ "extensions": ["./.xcsh/extensions/my-extra"]}सक्षम/अक्षम नियंत्रण
Section titled “सक्षम/अक्षम नियंत्रण”डिस्कवरी अक्षम करना
Section titled “डिस्कवरी अक्षम करना”- CLI:
--no-extensions - SDK विकल्प:
disableExtensionDiscovery
व्यवहार विभाजन:
- SDK: जब
disableExtensionDiscovery=trueहो, तब भी यहloadExtensions()के माध्यम सेadditionalExtensionPathsलोड करता है। - CLI पथ निर्माण (
main.ts) वर्तमान में--no-extensionsसेट होने पर CLI एक्सटेंशन पथ साफ़ कर देता है, इसलिए उस मोड में स्पष्ट-e/--hookअग्रेषित नहीं किए जाते।
विशिष्ट एक्सटेंशन मॉड्यूल अक्षम करना
Section titled “विशिष्ट एक्सटेंशन मॉड्यूल अक्षम करना”disabledExtensions सेटिंग एक्सटेंशन id प्रारूप द्वारा फ़िल्टर करती है:
extension-module:<derivedName>
derivedName एंट्री पथ (getExtensionNameFromPath) पर आधारित है, उदाहरण के लिए:
/x/foo.ts->foo/x/bar/index.ts->bar
उदाहरण:
disabledExtensions: - extension-module:fooपथ और एंट्री रिज़ॉल्यूशन
Section titled “पथ और एंट्री रिज़ॉल्यूशन”पथ सामान्यीकरण
Section titled “पथ सामान्यीकरण”कॉन्फ़िगर किए गए पथों के लिए:
- यूनिकोड स्पेस सामान्यीकरण
~का विस्तार- यदि सापेक्ष है, तो वर्तमान
cwdके विरुद्ध रिज़ॉल्व करें
यदि कॉन्फ़िगर किया गया पथ एक फ़ाइल है
Section titled “यदि कॉन्फ़िगर किया गया पथ एक फ़ाइल है”इसे सीधे मॉड्यूल एंट्री उम्मीदवार के रूप में उपयोग किया जाता है।
यदि कॉन्फ़िगर किया गया पथ एक डायरेक्टरी है
Section titled “यदि कॉन्फ़िगर किया गया पथ एक डायरेक्टरी है”रिज़ॉल्यूशन क्रम:
- उस डायरेक्टरी में
package.jsonजिसमेंxcsh.extensions(या लेगेसीpi.extensions) हो -> घोषित एंट्रीज़ का उपयोग करें index.tsindex.js- अन्यथा एक स्तर तक एक्सटेंशन एंट्रीज़ के लिए स्कैन करें:
- सीधी
*.ts/*.js - सबडायरेक्टरी
index.ts/index.js - सबडायरेक्टरी
package.jsonजिसमेंxcsh.extensions/pi.extensionsहो
- सीधी
नियम और प्रतिबंध:
- एक सबडायरेक्टरी स्तर से परे कोई पुनरावर्ती खोज नहीं
- घोषित
extensionsमैनिफ़ेस्ट एंट्रीज़ उस पैकेज डायरेक्टरी के सापेक्ष रिज़ॉल्व की जाती हैं - घोषित एंट्रीज़ केवल तभी शामिल की जाती हैं जब फ़ाइल मौजूद हो/एक्सेस की अनुमति हो
*/index.{ts,js}जोड़ों में, TypeScript को JavaScript पर प्राथमिकता दी जाती है- सिमलिंक को पात्र फ़ाइलों/डायरेक्टरियों के रूप में माना जाता है
इग्नोर व्यवहार स्रोत के अनुसार भिन्न होता है
Section titled “इग्नोर व्यवहार स्रोत के अनुसार भिन्न होता है”- नेटिव ऑटो-डिस्कवरी (डिस्कवरी हेल्पर्स में
discoverExtensionModulePaths) नेटिव glob का उपयोग करती है जिसमेंgitignore: trueऔरhidden: falseहो। loader.tsमें स्पष्ट कॉन्फ़िगर्ड डायरेक्टरी स्कैनिंगreaddirनियमों का उपयोग करती है और gitignore फ़िल्टरिंग लागू नहीं करती।
लोड क्रम और प्राथमिकता
Section titled “लोड क्रम और प्राथमिकता”discoverAndLoadExtensions() एक क्रमबद्ध सूची बनाता है और फिर loadExtensions() को कॉल करता है।
क्रम:
- नेटिव ऑटो-डिस्कवर किए गए मॉड्यूल
- स्पष्ट कॉन्फ़िगर किए गए पथ (प्रदान किए गए क्रम में)
sdk.ts में, कॉन्फ़िगर्ड क्रम है:
- CLI अतिरिक्त पथ
- सेटिंग्स
extensions
डी-डुप्लिकेशन:
- एब्सोल्यूट पथ आधारित
- पहले देखा गया पथ जीतता है
- बाद के डुप्लिकेट अनदेखे किए जाते हैं
निहितार्थ: यदि एक ही मॉड्यूल पथ ऑटो-डिस्कवर और स्पष्ट रूप से कॉन्फ़िगर दोनों है, तो यह पहली स्थिति (ऑटो-डिस्कवर चरण) पर एक बार लोड होता है।
मॉड्यूल इम्पोर्ट और फ़ैक्ट्री अनुबंध
Section titled “मॉड्यूल इम्पोर्ट और फ़ैक्ट्री अनुबंध”प्रत्येक उम्मीदवार पथ को डायनेमिक इम्पोर्ट से लोड किया जाता है:
await import(resolvedPath)- फ़ैक्ट्री
module.default ?? moduleहै - फ़ैक्ट्री एक फ़ंक्शन (
ExtensionFactory) होनी चाहिए
यदि एक्सपोर्ट एक फ़ंक्शन नहीं है, तो वह पथ एक संरचित त्रुटि के साथ विफल होता है और लोडिंग जारी रहती है।
विफलता हैंडलिंग और आइसोलेशन
Section titled “विफलता हैंडलिंग और आइसोलेशन”लोडिंग के दौरान
Section titled “लोडिंग के दौरान”प्रति एक्सटेंशन पथ, विफलताओं को { path, error } के रूप में कैप्चर किया जाता है और अन्य पथों को लोड होने से नहीं रोकता।
सामान्य मामले:
- इम्पोर्ट विफलता / अनुपस्थित फ़ाइल
- अमान्य फ़ैक्ट्री एक्सपोर्ट (नॉन-फ़ंक्शन)
- फ़ैक्ट्री निष्पादित करते समय अपवाद फेंका गया
रनटाइम आइसोलेशन मॉडल
Section titled “रनटाइम आइसोलेशन मॉडल”- एक्सटेंशन सैंडबॉक्स्ड नहीं हैं (समान प्रोसेस/रनटाइम)।
- वे एक
EventBusऔर एकExtensionRuntimeइंस्टेंस साझा करते हैं। - लोड के दौरान, रनटाइम एक्शन मेथड जानबूझकर
ExtensionRuntimeNotInitializedErrorफेंकते हैं; एक्शन वायरिंग बाद मेंExtensionRunner.initialize()में होती है।
लोडिंग के बाद
Section titled “लोडिंग के बाद”जब इवेंट ExtensionRunner के माध्यम से चलते हैं, तो हैंडलर अपवादों को पकड़ा जाता है और रनर लूप को क्रैश करने के बजाय एक्सटेंशन त्रुटियों के रूप में उत्सर्जित किया जाता है।
न्यूनतम उपयोगकर्ता/प्रोजेक्ट लेआउट उदाहरण
Section titled “न्यूनतम उपयोगकर्ता/प्रोजेक्ट लेआउट उदाहरण”उपयोगकर्ता-स्तर
Section titled “उपयोगकर्ता-स्तर”~/.xcsh/agent/ config.yml extensions/ guardrails.ts audit/ index.tsप्रोजेक्ट-स्तर
Section titled “प्रोजेक्ट-स्तर”<repo>/ .xcsh/ settings.json extensions/ checks/ package.json lint-gates.tschecks/package.json:
{ "xcsh": { "extensions": ["./src/check-a.ts", "./src/check-b.js"] }}लेगेसी मैनिफ़ेस्ट कुंजी अभी भी स्वीकृत:
{ "pi": { "extensions": ["./index.ts"] }}