Codex Security TypeScript SDK
Codex-Security-Scans aus TypeScript ausführen, Ziele und Anbieter auswählen, Ergebnisse prüfen und den Scan-Lebenszyklus verwalten.
Verwenden Sie das Codex Security TypeScript SDK, um Sicherheits-Scans für Repositories und Codeänderungen aus Ihrer Anwendung oder Ihrem Entwicklertool heraus auszuführen. Das SDK gibt typisierte Befunde, Abdeckungsdetails und Pfade zu Scan-Artefakten zurück. Für längere Scans unterstützt es Vorabprüfungen, Kostenlimits, Fortschritts-Callbacks und Abbruchvorgänge.
Das SDK verwendet ECMAScript-Module (ESM) und läuft serverseitig mit Node.js 24 oder 26 oder mit Node.js 22 ab Version 22.13.0. Für Scans ist außerdem Python 3.10 oder höher erforderlich.
Python 3.10 erfordert zusätzlich das Paket tomli.
SDK einrichten
Installieren Sie das SDK:
npm install @openai/codex-securityLegen Sie vor dem Start eines Scans OPENAI_API_KEY oder CODEX_API_KEY fest, verwenden Sie eine
vorhandene dateibasierte Codex-Anmeldung oder konfigurieren Sie einen anderen
Anbieter. Amazon Bedrock verwendet AWS-
Anmeldedaten; OpenRouter und Fireworks verwenden anbieterspezifische API keys und
Konfigurationen.
Für optimale Ergebnisse verwenden Sie ein Konto, das für Trusted Access for Cyber verifiziert ist. Die Anmeldung oder die Angabe eines API key gewährt keinen Trusted Access.
Scan ausführen
Das SDK wird mit Ihren lokalen Betriebssystemberechtigungen ausgeführt und wartet nicht auf eine Genehmigung. Scan-Prozesse können Ihre Umgebung übernehmen. Entfernen Sie daher nicht benötigte Zugangsdaten, bevor Sie beginnen. Siehe Berechtigungen für lokale Scans.
Speichern Sie dieses Beispiel als scan.mjs. Ersetzen Sie die Pfade, führen Sie einen Standard-Repository-Scan
aus und schließen Sie den Client nach Abschluss der Arbeit. Übergeben Sie outputDir, um ein privates
Ergebnisverzeichnis außerhalb des umgebenden Git-Worktrees auszuwählen.
Wenn Sie outputDir weglassen, speichert Codex Security die Ergebnisse in seinem eigenen persistenten
Zustandsverzeichnis. Ergebnisse können Quellcodeauszüge und Details zu Sicherheitslücken
enthalten. Legen Sie fest, wer sie lesen darf und wie lange sie aufbewahrt werden.
const security = new CodexSecurity();
try {
const result = await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
});
console.log(result.reportPath);
console.log(result.manifest.scan.status);
console.log(result.findings.findings.length);
} finally {
await security.close();
}Führen Sie das Beispiel mit Node.js aus:
node scan.mjsDas Beispiel gibt den Berichtspfad, den Scan-Status und die Anzahl der Befunde aus. Öffnen Sie den Bericht, um die Nachweise zu prüfen. Die Anzahl variiert je nach Repository und Scan. Verwenden Sie daher keine erwartete Anzahl, um die Funktionsfähigkeit der Integration zu prüfen.
run validiert die gespeicherten Artefakte und gibt ein ScanResult zurück, wenn
result.manifest.scan.status den Wert "completed" hat. Prüfen Sie result.coverage auf
überprüfte Bereiche, Ausschlüsse und zurückgestellte Arbeiten. Ein abgeschlossener Scan kann weiterhin
Abdeckungslücken aufweisen. Laufzeit-, Eingabe- oder Ergebnisintegritätsfehler können einen
Fehler auslösen.
Verwenden Sie in späteren Beispielen den geöffneten Client security erneut und belassen Sie close() in
finally, um die Laufzeitumgebung freizugeben. Fügen Sie zusätzliche Importe am Anfang von
scan.mjs hinzu.
Eingaben mit einer Vorabprüfung prüfen
Verwenden Sie preflight, um Repository, Ziel, Modus, Wissensbasisdokumente,
Ausgabeort und Codex-Konfiguration vor dem Start eines Scans zu prüfen:
const plan = await security.preflight("/path/to/repository", {
target: ["services/billing", "packages/auth"],
knowledgeBasePaths: ["/path/to/architecture.md"],
outputDir: "/path/outside/repository/results",
});
console.log(plan.repository);
console.log(plan.target.kind);
console.log(plan.mode);
console.log(plan.outputDir);Preflight prüft lokale Eingaben, ohne Codex zu starten, Zugangsdaten zu laden oder die Verfügbarkeit von Python und Plugins zu prüfen. Ein erfolgreicher Preflight belegt nicht, dass sich der Scan authentifizieren lässt oder gestartet werden kann.
Um die Archivierung für ein vorhandenes Ergebnisverzeichnis in der Vorschau anzuzeigen, setzen Sie
archiveExisting: true:
const plan = await security.preflight("/path/to/repository", {
outputDir: "/path/outside/repository/results",
archiveExisting: true,
});
console.log(plan.archiveDir);Das zurückgegebene archiveDir zeigt eine Vorschau der Archivbenennung. Der endgültige Pfad kann
abweichen, da run ein eigenes eindeutiges Ziel erzeugt. Erfassen Sie den tatsächlichen
Archivpfad mit onOutputArchived:
await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
archiveExisting: true,
onOutputArchived(archiveDir) {
console.log("Archived results:", archiveDir);
},
});Der Scan archiviert die früheren Ergebnisse und beginnt mit einem leeren Ausgabeverzeichnis.
Scan-Ziel auswählen
Das SDK unterstützt Repository-, Pfad-, Commit-Diff- und Working-Tree-Ziele. Standardziel ist das vollständige Repository.
Ausgewählte Pfade scannen
Übergeben Sie ein Array von Pfaden innerhalb des Repositories:
const result = await security.run("/path/to/repository", {
target: ["services/billing", "packages/auth"],
});Pfade können Dateien oder Verzeichnisse bezeichnen. Das SDK löst jeden Pfad innerhalb des Repositories auf und entfernt Duplikate.
Committete Änderungen scannen
Verwenden Sie DiffTarget.refs, um committete Änderungen zwischen zwei lokal verfügbaren
Git-Revisionen zu scannen:
const target = DiffTarget.refs({
base: "origin/main",
head: "HEAD",
});
const result = await security.run("/path/to/repository", { target });Der Head ist standardmäßig HEAD. Bei Diff-Zielen muss das Repository-Argument
das Stammverzeichnis des Git-Worktrees sein.
Working Tree scannen
Verwenden Sie DiffTarget.workingTree, um vorgemerkte und nicht vorgemerkte Änderungen gegenüber einer Basisrevision zu scannen:
const target = DiffTarget.workingTree({ base: "HEAD" });
const result = await security.run("/path/to/repository", { target });Die Basis ist standardmäßig HEAD. Rufen Sie die ausgewählten Revisionen ab, bevor Sie einen
Diff- oder Working-Tree-Scan starten.
Tiefenmodus auswählen
Legen Sie mode: "deep" für einen Repository- oder Pfad-Scan fest, der eine umfassendere Prüfung erfordert:
const result = await security.run("/path/to/repository", {
target: ["services/billing"],
mode: "deep",
workers: 2,
subagents: 0,
stopAfterNoNew: 3,
maxDiscoveryRuns: 10,
maxTimeHours: 1.5,
});Der Tiefenmodus unterstützt Repository- und Pfadziele. Verwenden Sie den Standardmodus für Diff- und
Working-Tree-Scans. Die optionalen Einstellungen steuern gleichzeitig ausgeführte, unabhängige
Standard-Scan-Worker, Subagenten pro Worker, aufeinanderfolgende abgeschlossene Worker-Scans
ohne neue Befunde sowie die Gesamtzahl und Dauer der Worker-Läufe. Sie
erfordern mode: "deep".
maxTimeHours hat den Standardwert 96 und akzeptiert eine positive Zahl bis 96,
auch Bruchteile von Stunden. Bei Erreichen des Zeitlimits stoppt Codex Security noch laufende
Worker, behält abgeschlossene Scan-Ergebnisse bei und führt sie im Abschlussbericht
zusammen. Prüfen Sie result.coverage auf zurückgestellte Arbeiten und offene Fragen.
Sicherheitswissensbasis hinzufügen
Übergeben Sie Architekturdokumente, Bedrohungsmodelle oder Sicherheitsrichtlinien über
knowledgeBasePaths:
const result = await security.run("/path/to/repository", {
knowledgeBasePaths: [
"/path/to/architecture.md",
"/path/to/security-policies",
],
});Das SDK akzeptiert Dateien oder Verzeichnisse und durchsucht Verzeichnisse rekursiv.
Unterstützte Dokumentformate sind .md, .markdown, .txt, .pdf und .docx.
Das SDK weist verknüpfte Eingabepfade zurück, überspringt verknüpfte Verzeichniseinträge und hält
extrahierte Dokumentinhalte von den gespeicherten Scan-Ergebnissen getrennt.
Scan- und Folgeanweisungen hinzufügen
Verwenden Sie scanPrompt, um den Scan zu fokussieren, und postScanPrompt, um eine Folgeprüfung anzufordern:
const result = await security.run("/path/to/repository", {
scanPrompt: "Focus on tenant isolation and authorization checks.",
postScanPrompt: "Write confirmed findings to post-scan-summary.md.",
});Wenn die Folgeprüfung fehlschlägt, behält das SDK den abgeschlossenen Scan bei und meldet den
Fehler über onWarning. Es stellt alle abgeschlossenen Scan-Artefakte wieder her, die durch die
Folgeprüfung geändert wurden.
Scan-Budget festlegen
Legen Sie maxCostUsd fest, um einen Scan zu stoppen, wenn seine geschätzten Modellkosten ein Limit überschreiten.
Verwenden Sie onCost, um die Kosten während des Scans zu verfolgen:
const result = await security.run("/path/to/repository", {
maxCostUsd: 5,
onCost(cost) {
console.log(cost.estimatedUsd);
},
});
console.log(result.cost?.estimatedUsd);Das Limit schätzt die Ausgaben, ist aber keine feste Obergrenze. Bereits laufende
Anfragen können daher mit Kosten leicht oberhalb des Limits abgeschlossen werden. Wenn ein Deep-Scan das Limit erreicht, nachdem
Codex Security die Ergebnisse abgeschlossener Worker zusammengeführt hat, kann run ein Ergebnis zurückgeben,
bei dem manifest.scan.status auf "completed" gesetzt ist, und die Budgetwarnung
über onWarning melden. Prüfen Sie result.coverage auf nicht abgeschlossene Arbeiten.
Wenn der Scan kein gültiges abgeschlossenes Ergebnis erzeugen kann, löst run
ScanCostLimitExceededError aus und behält alle verfügbaren Ausgaben bei.
Mit Scan-Ergebnissen arbeiten
ScanResult stellt die strukturierten Dokumente, Scan-Metadaten und Artefaktpfade bereit:
| Eigenschaft | Inhalt |
|---|---|
manifest |
Das versiegelte Scan-Manifest mit Ziel, Umfang, Erzeuger und Artefaktdatensätzen. |
findings |
Befunde des aktuellen Scans. Lesen Sie Befundobjekte aus findings.findings. |
repositoryFindings |
Offene Befunde über Repository-Scans hinweg, sofern ein Scan-Verlauf verfügbar ist. |
coverage |
Überprüfte Bereiche, Ausschlüsse, zurückgestellte Arbeiten und offene Fragen. |
scanDir |
Das Scan-Verzeichnis. |
threadId |
Die Codex-Thread-Kennung für den Scan. |
turnResult |
Turn-Status, Antwort und verfügbare Nutzungsmetadaten. |
cost |
Geschätzte Modell- und Token-Kosten oder null, falls nicht verfügbar. |
reportPath |
Der Pfad zu report.md. |
manifestPath |
Der Pfad zu scan-manifest.json. |
findingsPath |
Der Pfad zu findings.json. |
coveragePath |
Der Pfad zu coverage.json. |
artifactsDir |
Das Verzeichnis für ergänzende Artefakte. |
sarifPath |
Der generierte SARIF-Pfad oder null, wenn SARIF fehlt. |
pluginVersion |
Die vom Scan-Erzeuger aufgezeichnete Version. |
Um dasselbe Plugin für einen späteren Scan vorauszusetzen, übergeben Sie
expectedPluginVersion: result.pluginVersion. Das SDK weist den Scan zurück, wenn
die installierte Plugin-Version abweicht.
Verwenden Sie die strukturierten Befunde und Abdeckungsdaten direkt:
for (const finding of result.findings.findings) {
const location = finding.locations[0];
if (location === undefined) continue;
console.log(
finding.severity.level,
`${location.path}:${location.startLine}`,
finding.title
);
}
for (const deferred of result.coverage.deferred) {
console.log(deferred.id, deferred.reason);
}Befunde können die optionalen Felder codeEvidence, rootCause, validation,
attackPath, remediationTests und preventiveControls enthalten.
Bei repositoryweiten Befunden unterscheidet confirmedInLatestScan zwischen Befunden,
die im neuesten Scan erkannt wurden, und früheren Befunden, die weiterhin offen sind:
for (const finding of result.repositoryFindings ?? []) {
console.log(finding.title, finding.confirmedInLatestScan);
}Neue Ergebnisse enthalten kein coverage.completeness. Verwenden Sie manifest.scan.status
für den Ausführungsstatus und prüfen Sie zurückgestellte Bereiche, Ausschlüsse und offene
Fragen in coverage, um nachzuvollziehen, was der Scan überprüft hat.
result.toJSON() gibt Manifest, Repository- und aktuelle Scan-Befunde,
Abdeckung, Scan- und Thread-IDs, reportPath, artifactsDir,
sarifPath, Kosten und Turn-Metadaten in einem JSON-fähigen Objekt zurück.
Scan verfolgen oder abbrechen
Übergeben Sie ScanOptions-Callbacks, um Scan-Start, Worker-Fortschritt und
Verbindungswiederholungen zu melden:
const result = await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
onScanStarted() {
console.log("Scan started");
},
onProgress(progress) {
console.log(progress.phase, progress.filesCompleted, progress.filesTotal);
},
onWorkerStatus(status) {
console.log(status.kind, status);
},
onSessionEvent(session) {
console.log(session.threadId, session.worker, session.event["type"]);
},
onReconnect(attempt, maxAttempts) {
console.log(`Reconnect attempt ${attempt} of ${maxAttempts}`);
},
onObserverError(observer, error) {
console.error(`${observer} failed`, error);
},
});
console.log(result.reportPath);Übergeben Sie ein AbortSignal aus Ihrer Anfrage- oder Jobsteuerung, um einen Scan abzubrechen.
Wenn der Scan nach 30 Minuten noch läuft, unterbricht ihn dieses Beispiel und
gibt das Verzeichnis mit allen gespeicherten Ausgaben aus:
try {
await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
signal: AbortSignal.timeout(30 * 60 * 1000),
});
} catch (error) {
if (error instanceof ScanInterruptedError) {
console.error(error.scanDir);
} else {
throw error;
}
}Ein unterbrochener Scan kann Teilausgaben in scanDir hinterlassen. Bewahren Sie dieses
Verzeichnis auf, wenn das Ergebnis untersucht werden muss.
Anwendungen, die den Fortschritt der Scan-Einrichtung anzeigen, können außerdem die ScanOptions-
Lebenszyklus-Callbacks verwenden:
| Callback | Aufgerufen, wenn |
|---|---|
onAuthentication(authentication) |
Der Scan seine Authentifizierungsmethode auswählt. |
onOutputArchived(archiveDir) |
Vorhandene Ergebnisse in das Archivverzeichnis verschoben werden. |
onOutputDirReady(scanDir) |
Das private Scan-Verzeichnis bereit ist. |
onScanStarted() |
Die Scan-Einrichtung abgeschlossen ist und die Ausführung beginnt. |
onTrustedAccessStatus(status) |
Der Trusted-Access-Status verfügbar wird. |
onReconnect(attempt, maxAttempts) |
Das SDK einen getrennten Scan-Stream erneut verbindet. |
onActivity(activity) |
Ein Befehl, Tool, Denkschritt oder eine Nachricht aktualisiert wird. |
onProgress(progress) |
Sich die Scan-Phase oder die Anzahl geprüfter Dateien ändert. |
onWorkerStatus(status) |
Sich der Status der Worker-Vorabprüfung oder -Zuweisung ändert. |
onSessionEvent(session) |
Eine Scan- oder Worker-Sitzung ein Ereignis ausgibt. |
onCost(cost) |
Eine aktualisierte Schätzung der Scan-Kosten verfügbar ist. |
onWarning(warning) |
Der Scan eine Warnung meldet. |
onObserverError(observer, error) |
Ein anderer Scan-Lebenszyklus-Callback einen Fehler auslöst. |
Der Trusted-Access-Status ist granted, not_granted oder unknown. Fehlender oder
unbekannter Zugriff löst ebenfalls onWarning aus.
onSessionEvent empfängt Ereignisse ohne Unkenntlichmachung vertraulicher Inhalte, die Quellcode
oder Anmeldedaten enthalten können. Filtern Sie sie, bevor Sie sie an gemeinsame Protokolle oder andere
Dienste senden.
Laufzeit und Anmeldedaten konfigurieren
Übergeben Sie eine Laufzeitkonfiguration, wenn Sie ein bestimmtes Plugin, einen bestimmten Interpreter oder eine Codex-Einstellung benötigen. Wählen Sie ein Modell, auf das Sie mit Ihren Anmeldedaten zugreifen können. Wenn Sie die ChatGPT-Anmeldung verwenden, prüfen Sie die Verfügbarkeit von GPT-6.1 Sol, bevor Sie dieses Beispiel verwenden:
const security = new CodexSecurity({
pluginPath: "/path/to/codex-security-plugin",
pythonPath: "/path/to/python",
codexOverrides: {
model: "gpt-6.1-sol",
model_reasoning_effort: "medium",
},
});pluginPath akzeptiert ein Plugin-Verzeichnis oder eine ZIP-Datei. pythonPath wählt den
Plugin-Interpreter aus. codexOverrides führt unterstützte Werte mit der isolierten
Codex-Konfiguration zusammen. Scans verwenden standardmäßig gpt-5.6-sol mit besonders hohem Reasoning-Aufwand.
Legen Sie model und model_reasoning_effort in codexOverrides fest, um
ein anderes Modell oder einen anderen Reasoning-Aufwand zu verwenden. Um Amazon
Bedrock zu verwenden, legen Sie
model_provider und model in codexOverrides fest.
codexOverrides kann den Dateisystemzugriff des Scans nicht einschränken oder seine
Genehmigungsrichtlinie ändern. Siehe Berechtigungen für lokale
Scans.
Geben Sie für OpenRouter oder Fireworks außerdem den passenden API key und eine vollständige
Anbieterkonfiguration in codexOverrides an. Legen Sie beispielsweise
OPENROUTER_API_KEY fest und konfigurieren Sie OpenRouter:
const security = new CodexSecurity({
codexOverrides: {
model: "anthropic/claude-sonnet-4.5",
model_provider: "openrouter",
model_providers: {
openrouter: {
name: "OpenRouter",
base_url: "https://openrouter.ai/api/v1",
env_key: "OPENROUTER_API_KEY",
wire_api: "responses",
},
},
},
});Ändern Sie für Fireworks beide openrouter-Schlüssel in fireworks, setzen Sie name auf
Fireworks AI, setzen Sie env_key auf FIREWORKS_API_KEY, verwenden Sie
https://api.fireworks.ai/inference/v1 als base_url und wählen Sie ein Fireworks-
Modell aus.
Der Client stellt außerdem unterstützte Authentifizierungsmethoden bereit:
| Methode | Zweck |
|---|---|
loginApiKey(apiKey) |
Die isolierte Laufzeit mit einem API key authentifizieren. |
loginChatGPT() |
Einen Browser-Anmeldevorgang starten und ein Anmelde-Handle zurückgeben. |
loginChatGPTDeviceCode() |
Einen Gerätecode-Anmeldevorgang starten und ein Anmelde-Handle zurückgeben. |
account() |
Den aktuellen Authentifizierungsstatus zurückgeben. |
logout() |
Die isolierte Authentifizierung löschen. |
Ein Anmelde-Handle stellt waitForInstructions, authUrl, verificationUrl,
userCode, wait und cancel bereit, damit eine Anwendung den
ausgewählten Anmeldeablauf anzeigen und abschließen kann. Das SDK kann eine dateibasierte Codex-Anmeldung wiederverwenden. Verwenden Sie API keys
für CI und serverseitige Automatisierung.
Wenn sowohl ein API key als auch eine gespeicherte Anmeldung verfügbar sind, verwendet das SDK standardmäßig den API key. Um stattdessen Ihre ChatGPT-Anmeldung zu verwenden, wählen Sie sie für den Scan aus:
const result = await security.run("/path/to/repository", {
auth: "chatgpt",
});Legen Sie auth: "api-key" fest, um einen API key aus der Umgebung vorauszusetzen. preflight akzeptiert
dieselbe Option auth.
Scan-Fehler behandeln
Fangen Sie die exportierte Fehlerklasse ab, die der möglichen Reaktion Ihrer Anwendung entspricht:
| Fehler | Bedeutung |
|---|---|
AuthenticationRequiredError |
Ein Scan benötigt unterstützte Anmeldedaten. |
ConfigurationError |
Die Codex-Konfiguration oder eine Überschreibung ist ungeeignet. |
InvalidTargetError |
Repository, Pfad, Modus oder Git-Ziel ist ungeeignet. |
OutputDirectoryError |
Der Ausgabeort oder seine Berechtigungen sind ungeeignet. |
OutputInsideProtectedRootError |
Das Ausgabeverzeichnis befindet sich im gescannten Repository oder Worktree. |
PluginPythonUnavailableError |
Es ist kein verwendbarer Python-Interpreter verfügbar. |
PluginBootstrapError |
Die Plugin-Laufzeit konnte nicht gestartet werden. |
ScanCostLimitExceededError |
Der Scan hat sein geschätztes Kostenlimit überschritten. |
IncompleteScanError |
Der Scan wurde beendet, bevor das erforderliche Ergebnis erzeugt wurde. |
ContractValidationError |
Ein abgeschlossener Scan hat einen Fehler im strukturierten Vertrag zurückgegeben. |
ScanInterruptedError |
Eine Unterbrechung hat den Scan gestoppt und möglicherweise Teilausgaben hinterlassen. |
Fahren Sie mit dem CLI-Schnellstart, dem CI-Leitfaden oder der CLI-Referenz fort.