- Startseite
- Documentation
- Erweiterungen
- Erweiterungsladen (TypeScript/JavaScript-Module)
Erweiterungsladen (TypeScript/JavaScript-Module)
Dieses Dokument beschreibt, wie der Coding-Agent Erweiterungsmodule (.ts/.js) beim Start erkennt und lädt.
Es behandelt nicht gemini-extension.json-Manifest-Erweiterungen (separat dokumentiert).
Was dieses Subsystem leistet
Abschnitt betitelt „Was dieses Subsystem leistet“Das Erweiterungsladen erstellt eine Liste von Modul-Einstiegsdateien, importiert jedes Modul mit Bun, führt seine Factory aus und gibt zurück:
- geladene Erweiterungsdefinitionen
- pfadbezogene Ladefehler (ohne den gesamten Ladevorgang abzubrechen)
- ein gemeinsames Erweiterungs-Laufzeitobjekt, das später von
ExtensionRunnerverwendet wird
Primäre Implementierungsdateien
Abschnitt betitelt „Primäre Implementierungsdateien“src/extensibility/extensions/loader.ts— Pfaderkennung + Import/Ausführungsrc/extensibility/extensions/index.ts— öffentliche Exportesrc/extensibility/extensions/runner.ts— Laufzeit-/Ereignisausführung nach dem Ladensrc/discovery/builtin.ts— nativer Auto-Discovery-Provider für Erweiterungsmodulesrc/config/settings.ts— lädt zusammengeführteextensions/disabledExtensions-Einstellungen
Eingaben für das Erweiterungsladen
Abschnitt betitelt „Eingaben für das Erweiterungsladen“1) Automatisch erkannte native Erweiterungsmodule
Abschnitt betitelt „1) Automatisch erkannte native Erweiterungsmodule“discoverAndLoadExtensions() fragt zunächst Discovery-Provider nach extension-module-Capability-Einträgen und behält dann nur Provider-native-Einträge.
Effektive native Speicherorte:
- Projekt:
<cwd>/.xcsh/extensions - Benutzer:
~/.xcsh/agent/extensions
Pfad-Wurzeln stammen vom nativen Provider (SOURCE_PATHS.native).
Hinweise:
- Die native Auto-Discovery basiert derzeit auf
.xcsh. - Legacy
.piwird inpackage.json-Manifest-Schlüsseln (pi.extensions) weiterhin akzeptiert, jedoch nicht als native Wurzel hier.
2) Explizit konfigurierte Pfade
Abschnitt betitelt „2) Explizit konfigurierte Pfade“Nach der Auto-Discovery werden konfigurierte Pfade angehängt und aufgelöst.
Konfigurierte Pfadquellen im Haupt-Session-Startpfad (sdk.ts):
- CLI-bereitgestellte Pfade (
--extension/-e, und--hookwird ebenfalls als Erweiterungspfad behandelt) - Einstellungs-Array
extensions(zusammengeführte globale und Projekteinstellungen)
Globale Einstellungsdatei:
~/.xcsh/agent/config.yml(oder benutzerdefiniertes Agent-Verzeichnis viaPI_CODING_AGENT_DIR)
Projekteinstellungsdatei:
<cwd>/.xcsh/settings.json
Beispiele:
extensions: - ~/my-exts/safety.ts - ./local/ext-pack{ "extensions": ["./.xcsh/extensions/my-extra"]}Aktivierungs-/Deaktivierungssteuerung
Abschnitt betitelt „Aktivierungs-/Deaktivierungssteuerung“Discovery deaktivieren
Abschnitt betitelt „Discovery deaktivieren“- CLI:
--no-extensions - SDK-Option:
disableExtensionDiscovery
Verhaltensaufteilung:
- SDK: wenn
disableExtensionDiscovery=true, werdenadditionalExtensionPathsweiterhin überloadExtensions()geladen. - CLI-Pfadaufbau (
main.ts) löscht CLI-Erweiterungspfade derzeit, wenn--no-extensionsgesetzt ist, sodass explizite-e/--hookin diesem Modus nicht weitergeleitet werden.
Bestimmte Erweiterungsmodule deaktivieren
Abschnitt betitelt „Bestimmte Erweiterungsmodule deaktivieren“Die Einstellung disabledExtensions filtert nach Erweiterungs-ID-Format:
extension-module:<derivedName>
derivedName basiert auf dem Einstiegspfad (getExtensionNameFromPath), zum Beispiel:
/x/foo.ts->foo/x/bar/index.ts->bar
Beispiel:
disabledExtensions: - extension-module:fooPfad- und Eintragsauflösung
Abschnitt betitelt „Pfad- und Eintragsauflösung“Pfadnormalisierung
Abschnitt betitelt „Pfadnormalisierung“Für konfigurierte Pfade:
- Unicode-Leerzeichen normalisieren
~erweitern- Bei relativen Pfaden gegen aktuelles
cwdauflösen
Wenn der konfigurierte Pfad eine Datei ist
Abschnitt betitelt „Wenn der konfigurierte Pfad eine Datei ist“Sie wird direkt als Moduleintragskandidat verwendet.
Wenn der konfigurierte Pfad ein Verzeichnis ist
Abschnitt betitelt „Wenn der konfigurierte Pfad ein Verzeichnis ist“Auflösungsreihenfolge:
package.jsonin diesem Verzeichnis mitxcsh.extensions(oder Legacypi.extensions) -> deklarierte Einträge verwendenindex.tsindex.js- Andernfalls eine Ebene nach Erweiterungseinträgen scannen:
- direkte
*.ts/*.js - Unterverzeichnis
index.ts/index.js - Unterverzeichnis
package.jsonmitxcsh.extensions/pi.extensions
- direkte
Regeln und Einschränkungen:
- keine rekursive Erkennung über eine Unterverzeichnisebene hinaus
- deklarierte
extensions-Manifest-Einträge werden relativ zu diesem Paketverzeichnis aufgelöst - deklarierte Einträge werden nur einbezogen, wenn die Datei vorhanden ist/der Zugriff erlaubt ist
- bei
*/index.{ts,js}-Paaren wird TypeScript gegenüber JavaScript bevorzugt - Symlinks werden als zulässige Dateien/Verzeichnisse behandelt
Ignorierverhalten unterscheidet sich je nach Quelle
Abschnitt betitelt „Ignorierverhalten unterscheidet sich je nach Quelle“- Native Auto-Discovery (
discoverExtensionModulePathsin Discovery-Hilfsfunktionen) verwendet nativen Glob mitgitignore: trueundhidden: false. - Explizites konfiguriertes Verzeichnis-Scanning in
loader.tsverwendetreaddir-Regeln und wendet keine Gitignore-Filterung an.
Ladereihenfolge und Vorrang
Abschnitt betitelt „Ladereihenfolge und Vorrang“discoverAndLoadExtensions() erstellt eine geordnete Liste und ruft dann loadExtensions() auf.
Reihenfolge:
- Nativ automatisch erkannte Module
- Explizit konfigurierte Pfade (in angegebener Reihenfolge)
In sdk.ts lautet die konfigurierte Reihenfolge:
- Zusätzliche CLI-Pfade
- Einstellungen
extensions
Deduplizierung:
- absolut pfadbasiert
- erster gefundener Pfad hat Vorrang
- spätere Duplikate werden ignoriert
Implikation: Wenn derselbe Modulpfad sowohl automatisch erkannt als auch explizit konfiguriert ist, wird er einmal an der ersten Position geladen (Phase der automatischen Erkennung).
Modulimport und Factory-Vertrag
Abschnitt betitelt „Modulimport und Factory-Vertrag“Jeder Kandidatenpfad wird mit dynamischem Import geladen:
await import(resolvedPath)- Factory ist
module.default ?? module - Factory muss eine Funktion sein (
ExtensionFactory)
Wenn der Export keine Funktion ist, schlägt dieser Pfad mit einem strukturierten Fehler fehl und das Laden wird fortgesetzt.
Fehlerbehandlung und Isolation
Abschnitt betitelt „Fehlerbehandlung und Isolation“Während des Ladens
Abschnitt betitelt „Während des Ladens“Pro Erweiterungspfad werden Fehler als { path, error } erfasst und verhindern nicht das Laden anderer Pfade.
Häufige Fälle:
- Importfehler / fehlende Datei
- ungültiger Factory-Export (keine Funktion)
- Ausnahme beim Ausführen der Factory
Laufzeit-Isolationsmodell
Abschnitt betitelt „Laufzeit-Isolationsmodell“- Erweiterungen sind nicht sandboxed (gleicher Prozess/Laufzeit).
- Sie teilen einen
EventBusund eineExtensionRuntime-Instanz. - Während des Ladens werfen Laufzeit-Aktionsmethoden absichtlich
ExtensionRuntimeNotInitializedError; die Aktionsverdrahtung erfolgt später inExtensionRunner.initialize().
Nach dem Laden
Abschnitt betitelt „Nach dem Laden“Wenn Ereignisse durch ExtensionRunner laufen, werden Handler-Ausnahmen abgefangen und als Erweiterungsfehler ausgegeben, anstatt die Runner-Schleife zum Absturz zu bringen.
Minimale Benutzer-/Projekt-Layout-Beispiele
Abschnitt betitelt „Minimale Benutzer-/Projekt-Layout-Beispiele“Benutzerebene
Abschnitt betitelt „Benutzerebene“~/.xcsh/agent/ config.yml extensions/ guardrails.ts audit/ index.tsProjektebene
Abschnitt betitelt „Projektebene“<repo>/ .xcsh/ settings.json extensions/ checks/ package.json lint-gates.tschecks/package.json:
{ "xcsh": { "extensions": ["./src/check-a.ts", "./src/check-b.js"] }}Legacy-Manifest-Schlüssel wird weiterhin akzeptiert:
{ "pi": { "extensions": ["./index.ts"] }}