- Home
- Documentation
- Estensioni
- Caricamento delle estensioni (Moduli TypeScript/JavaScript)
Caricamento delle estensioni (Moduli TypeScript/JavaScript)
Questo documento tratta come l’agente di codifica individua e carica i moduli di estensione (.ts/.js) all’avvio.
Non copre le estensioni con manifesto gemini-extension.json (documentate separatamente).
Cosa fa questo sottosistema
Sezione intitolata “Cosa fa questo sottosistema”Il caricamento delle estensioni costruisce un elenco di file entry dei moduli, importa ciascun modulo con Bun, esegue la sua factory e restituisce:
- le definizioni delle estensioni caricate
- gli errori di caricamento per ciascun percorso (senza interrompere l’intero caricamento)
- un oggetto runtime di estensione condiviso, utilizzato successivamente da
ExtensionRunner
File di implementazione principali
Sezione intitolata “File di implementazione principali”src/extensibility/extensions/loader.ts— scoperta dei percorsi + importazione/esecuzionesrc/extensibility/extensions/index.ts— esportazioni pubblichesrc/extensibility/extensions/runner.ts— esecuzione runtime/eventi dopo il caricamentosrc/discovery/builtin.ts— provider di auto-scoperta nativo per i moduli di estensionesrc/config/settings.ts— carica le impostazioni uniteextensions/disabledExtensions
Input per il caricamento delle estensioni
Sezione intitolata “Input per il caricamento delle estensioni”1) Moduli di estensione nativi scoperti automaticamente
Sezione intitolata “1) Moduli di estensione nativi scoperti automaticamente”discoverAndLoadExtensions() chiede prima ai provider di scoperta gli elementi con capability extension-module, poi mantiene solo gli elementi del provider native.
Posizioni native effettive:
- Progetto:
<cwd>/.xcsh/extensions - Utente:
~/.xcsh/agent/extensions
Le radici dei percorsi provengono dal provider nativo (SOURCE_PATHS.native).
Note:
- L’auto-scoperta nativa è attualmente basata su
.xcsh. - Il legacy
.piè ancora accettato nelle chiavi del manifestopackage.json(pi.extensions), ma non come radice nativa in questo contesto.
2) Percorsi configurati esplicitamente
Sezione intitolata “2) Percorsi configurati esplicitamente”Dopo l’auto-scoperta, i percorsi configurati vengono aggiunti e risolti.
Fonti dei percorsi configurati nel percorso di avvio della sessione principale (sdk.ts):
- Percorsi forniti via CLI (
--extension/-e, e--hookè anch’esso trattato come percorso di estensione) - Array
extensionsnelle impostazioni (impostazioni globali + progetto unite)
File delle impostazioni globali:
~/.xcsh/agent/config.yml(o directory agente personalizzata tramitePI_CODING_AGENT_DIR)
File delle impostazioni di progetto:
<cwd>/.xcsh/settings.json
Esempi:
extensions: - ~/my-exts/safety.ts - ./local/ext-pack{ "extensions": ["./.xcsh/extensions/my-extra"]}Controlli di abilitazione/disabilitazione
Sezione intitolata “Controlli di abilitazione/disabilitazione”Disabilitare la scoperta
Sezione intitolata “Disabilitare la scoperta”- CLI:
--no-extensions - Opzione SDK:
disableExtensionDiscovery
Differenza di comportamento:
- SDK: quando
disableExtensionDiscovery=true, carica comunqueadditionalExtensionPathstramiteloadExtensions(). - La costruzione dei percorsi CLI (
main.ts) attualmente svuota i percorsi di estensione CLI quando--no-extensionsè impostato, quindi i percorsi espliciti-e/--hooknon vengono inoltrati in quella modalità.
Disabilitare moduli di estensione specifici
Sezione intitolata “Disabilitare moduli di estensione specifici”L’impostazione disabledExtensions filtra per formato id dell’estensione:
extension-module:<derivedName>
derivedName è basato sul percorso entry (getExtensionNameFromPath), ad esempio:
/x/foo.ts->foo/x/bar/index.ts->bar
Esempio:
disabledExtensions: - extension-module:fooRisoluzione di percorsi ed entry
Sezione intitolata “Risoluzione di percorsi ed entry”Normalizzazione dei percorsi
Sezione intitolata “Normalizzazione dei percorsi”Per i percorsi configurati:
- Normalizzazione degli spazi unicode
- Espansione di
~ - Se relativo, risoluzione rispetto al
cwdcorrente
Se il percorso configurato è un file
Sezione intitolata “Se il percorso configurato è un file”Viene utilizzato direttamente come candidato entry del modulo.
Se il percorso configurato è una directory
Sezione intitolata “Se il percorso configurato è una directory”Ordine di risoluzione:
package.jsonin quella directory conxcsh.extensions(o legacypi.extensions) -> utilizza le entry dichiarateindex.tsindex.js- Altrimenti scansiona un livello per le entry di estensione:
- file diretti
*.ts/*.js - sottodirectory
index.ts/index.js - sottodirectory
package.jsonconxcsh.extensions/pi.extensions
- file diretti
Regole e vincoli:
- nessuna scoperta ricorsiva oltre un livello di sottodirectory
- le entry di manifesto dichiarate con
extensionssono risolte relativamente alla directory del pacchetto - le entry dichiarate sono incluse solo se il file esiste/l’accesso è consentito
- nelle coppie
*/index.{ts,js}, TypeScript è preferito rispetto a JavaScript - i link simbolici sono trattati come file/directory eleggibili
Il comportamento di ignore differisce per fonte
Sezione intitolata “Il comportamento di ignore differisce per fonte”- L’auto-scoperta nativa (
discoverExtensionModulePathsnegli helper di scoperta) utilizza glob nativo congitignore: trueehidden: false. - La scansione esplicita di directory configurate in
loader.tsutilizza regolereaddire non applica il filtraggio gitignore.
Ordine di caricamento e precedenza
Sezione intitolata “Ordine di caricamento e precedenza”discoverAndLoadExtensions() costruisce un’unica lista ordinata e poi chiama loadExtensions().
Ordine:
- Moduli scoperti automaticamente in modo nativo
- Percorsi configurati esplicitamente (nell’ordine fornito)
In sdk.ts, l’ordine configurato è:
- Percorsi aggiuntivi CLI
extensionsdalle impostazioni
De-duplicazione:
- basata sul percorso assoluto
- il primo percorso trovato ha la precedenza
- i duplicati successivi vengono ignorati
Implicazione: se lo stesso percorso di modulo è sia scoperto automaticamente che configurato esplicitamente, viene caricato una sola volta nella prima posizione (fase di auto-scoperta).
Importazione del modulo e contratto della factory
Sezione intitolata “Importazione del modulo e contratto della factory”Ogni percorso candidato viene caricato con importazione dinamica:
await import(resolvedPath)- la factory è
module.default ?? module - la factory deve essere una funzione (
ExtensionFactory)
Se l’export non è una funzione, quel percorso fallisce con un errore strutturato e il caricamento continua.
Gestione dei fallimenti e isolamento
Sezione intitolata “Gestione dei fallimenti e isolamento”Durante il caricamento
Sezione intitolata “Durante il caricamento”Per ciascun percorso di estensione, i fallimenti vengono catturati come { path, error } e non impediscono il caricamento degli altri percorsi.
Casi comuni:
- fallimento dell’importazione / file mancante
- export factory non valido (non-funzione)
- eccezione lanciata durante l’esecuzione della factory
Modello di isolamento a runtime
Sezione intitolata “Modello di isolamento a runtime”- Le estensioni non sono sandboxate (stesso processo/runtime).
- Condividono un unico
EventBuse un’unica istanzaExtensionRuntime. - Durante il caricamento, i metodi di azione del runtime lanciano intenzionalmente
ExtensionRuntimeNotInitializedError; il collegamento delle azioni avviene successivamente inExtensionRunner.initialize().
Dopo il caricamento
Sezione intitolata “Dopo il caricamento”Quando gli eventi vengono eseguiti attraverso ExtensionRunner, le eccezioni degli handler vengono catturate ed emesse come errori dell’estensione invece di far crashare il ciclo del runner.
Esempi minimi di layout utente/progetto
Sezione intitolata “Esempi minimi di layout utente/progetto”Livello utente
Sezione intitolata “Livello utente”~/.xcsh/agent/ config.yml extensions/ guardrails.ts audit/ index.tsLivello progetto
Sezione intitolata “Livello progetto”<repo>/ .xcsh/ settings.json extensions/ checks/ package.json lint-gates.tschecks/package.json:
{ "xcsh": { "extensions": ["./src/check-a.ts", "./src/check-b.js"] }}Chiave di manifesto legacy ancora accettata:
{ "pi": { "extensions": ["./index.ts"] }}