Codex Security TypeScript SDK
Codex-Security-Scans aus TypeScript ausführen, Ziele und Anbieter auswählen, Ergebnisse prüfen und den Scanlebenszyklus verwalten.
Verwenden Sie das Codex Security TypeScript SDK, um Sicherheits-Scans für Repositorys und Codeänderungen aus Ihrer Anwendung oder Ihrem Entwicklertool auszuführen. Das SDK gibt typisierte Befunde, Abdeckungsdetails und Pfade zu Scanartefakten zurück. Für längere Scans unterstützt es Vorabprüfungen, Kostenlimits, Fortschritts-Callbacks und Abbruch.
Das SDK verwendet ECMAScript-Module (ESM) und wird serverseitig mit Node.js 22 oder höher ausgeführt. Für Scans ist außerdem Python 3.10 oder höher erforderlich.
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 Amazon
Bedrock mit AWS-Anmeldedaten und
ausdrücklichen Überschreibungen für model_provider und model.
Verwenden Sie für optimale Ergebnisse ein Konto, das für Trusted Access for Cyber verifiziert wurde. Eine Anmeldung oder die Angabe eines API key gewährt keinen Trusted Access.
Scan ausführen
Erstellen Sie einen Client vom Typ CodexSecurity, führen Sie einen regulären 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 Quelltextausschnitte und Details zu Schwachstellen
enthalten. Wählen Sie daher geeignete Berechtigungen und Aufbewahrungsrichtlinien.
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.coverage.completeness);
console.log(result.findings.findings.length);
} finally {
await security.close();
}run startet den Scan, wartet auf den Abschluss, validiert die versiegelten Artefakte
und gibt ein ScanResult zurück. close gibt die isolierte Laufzeit frei und unterstützt
wiederholte Aufrufe.
Eingaben mit einer Vorabprüfung prüfen
Verwenden Sie preflight, um Repository, Ziel, Modus, Ausgabeort und
Codex-Konfiguration zu prüfen, bevor Sie einen Scan starten:
const plan = await security.preflight("/path/to/repository", {
target: ["services/billing", "packages/auth"],
outputDir: "/path/outside/repository/results",
});
console.log(plan.repository);
console.log(plan.target.kind);
console.log(plan.mode);
console.log(plan.outputDir);Die Vorabprüfung lässt die Codex-Laufzeit und die Anmeldedaten unverändert. Auch die Erkennung von Plugin und Python bleibt dem eigentlichen Scan überlassen. Dadurch eignet sich die Vorabprüfung zur Prüfung von Benutzereingaben vor einem lang laufenden Vorgang oder einem Vorgang mit Anmeldedaten.
Um die Archivierung für ein vorhandenes Ergebnisverzeichnis vorab 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 generiert. 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 Ausgabe- verzeichnis.
Scanziel auswählen
Das SDK unterstützt Repository-, Pfad-, Committed-Diff- und Working-Tree-Ziele. Das Standardziel ist das vollständige Repository.
Ausgewählte Pfade scannen
Übergeben Sie ein Array von Pfaden innerhalb des Repositorys:
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 Repositorys 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 gestagte und nicht gestagte Änderungen gegenüber einer Base-
Revision zu scannen:
const target = DiffTarget.workingTree({ base: "HEAD" });
const result = await security.run("/path/to/repository", { target });Die Base 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 Pfadscan fest, der eine umfassendere Prüfung benötigt:
const result = await security.run("/path/to/repository", {
target: ["services/billing"],
mode: "deep",
});Der Tiefenmodus unterstützt Repository- und Pfadziele. Verwenden Sie für Diff- und Working-Tree-Scans den Standardmodus.
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 lehnt verlinkte Eingabepfade ab, überspringt verlinkte Verzeichniseinträge und hält
extrahierte Dokumentinhalte von den gespeicherten Scanergebnissen getrennt.
Scanbudget 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 ist eine Schätzung und keine feste Ausgabenobergrenze. Bereits laufende Anfragen
können darüber hinaus abgeschlossen werden. Wenn der Scan das Limit überschreitet, löst das SDK
ScanCostLimitExceededError aus und bewahrt die verfügbaren Ergebnisse auf.
Mit Scanergebnissen arbeiten
ScanResult stellt die strukturierten Dokumente, Scanmetadaten und Artefakt-
pfade bereit:
| Eigenschaft | Inhalt |
|---|---|
manifest |
Das versiegelte Scanmanifest einschließlich Ziel, Umfang, Produzent und Artefaktdatensätzen. |
findings |
Das Befunddokument. Lesen Sie Befundobjekte aus findings.findings. |
coverage |
Geprüfte Bereiche, Ausschlüsse, zurückgestellte Arbeit, offene Fragen und Vollständigkeit. |
scanDir |
Das Scanverzeichnis. |
threadId |
Die Codex-Thread-ID des Scans. |
turnResult |
Turn-Status, Antwort und verfügbare Nutzungsmetadaten. |
cost |
Geschätzte Modell- und Tokenkosten oder null, wenn 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 unterstützende Artefakte. |
sarifPath |
Der generierte SARIF-Pfad oder null, wenn SARIF fehlt. |
pluginVersion |
Die vom Scanproduzenten aufgezeichnete Version. |
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);
}Die Vollständigkeit der Abdeckung ist complete, partial oder unknown. Prüfen Sie zurückgestellte
Bereiche, Ausschlüsse und offene Fragen, bevor Sie einen Scan als Nachweis für eine
Sicherheitsentscheidung verwenden.
result.toJSON() gibt Manifest, Befunde, Abdeckung, Scan- und Thread-
IDs, reportPath, artifactsDir, sarifPath sowie Turn-Metadaten in
einem JSON-kompatiblen Objekt zurück.
Scan verfolgen oder abbrechen
Übergeben Sie ScanOptions-Callbacks, um über Scanstart, Worker-Fortschritt und
Verbindungswiederholungen zu berichten:
const result = await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
onScanStarted() {
console.log("Scan started");
},
onWorkerStatus(status) {
console.log(status.kind, status);
},
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, wenn der Abbruch durch eine Anfrage, einen Job-Controller
oder ein Zeitlimit ausgelöst wird:
const controller = new AbortController();
try {
const scan = security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
signal: controller.signal,
});
controller.abort();
await scan;
} catch (error) {
if (error instanceof ScanInterruptedError) {
console.error(error.scanDir);
} else {
throw error;
}
}Ein unterbrochener Scan kann eine Teilausgabe in scanDir hinterlassen. Bewahren Sie dieses
Verzeichnis auf, wenn das Ergebnis untersucht werden muss.
Anwendungen, die den Einrichtungsfortschritt eines Scans anzeigen, können auch die Lebenszyklus-Callbacks
ScanOptions verwenden:
| Callback | Wird aufgerufen, wenn |
|---|---|
onOutputArchived(archiveDir) |
Vorhandene Ergebnisse in das Archivverzeichnis verschoben werden. |
onOutputDirReady(scanDir) |
Das private Scanverzeichnis bereit ist. |
onScanStarted() |
Die Scaneinrichtung abgeschlossen ist und die Ausführung beginnt. |
onReconnect(attempt, maxAttempts) |
Das SDK einen getrennten Scanstream erneut verbindet. |
onWorkerStatus(status) |
Sich der Status der Worker-Vorabprüfung oder -Verteilung ändert. |
onCost(cost) |
Aktualisierte geschätzte Scankosten verfügbar sind. |
onObserverError(observer, error) |
Ein anderer Scanlebenszyklus-Callback einen Fehler auslöst. |
Laufzeit und Anmeldedaten konfigurieren
Übergeben Sie eine Laufzeitkonfiguration, wenn Sie ein bestimmtes Plugin, einen Interpreter oder eine Codex-Einstellung benötigen:
const security = new CodexSecurity({
pluginPath: "/path/to/codex-security-plugin",
pythonPath: "/path/to/python",
codexOverrides: {
model: "gpt-5.6-terra",
model_reasoning_effort: "high",
},
});pluginPath akzeptiert ein Plugin-Verzeichnis oder ZIP. 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 extra-high reasoning effort.
Legen Sie model und model_reasoning_effort in codexOverrides fest, um
ein anderes Modell oder einen anderen reasoning effort zu verwenden. Um Amazon
Bedrock zu verwenden, legen Sie
model_provider und model in codexOverrides fest.
Der Client stellt außerdem unterstützte Authentifizierungsmethoden bereit:
| Methode | Zweck |
|---|---|
loginApiKey(apiKey) |
Die isolierte Laufzeit mit einem API key authentifizieren. |
loginChatGPT() |
Einen Browser-Anmeldeablauf starten und ein Anmelde-Handle zurückgeben. |
loginChatGPTDeviceCode() |
Einen Gerätecode-Anmeldeablauf 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 darstellen und abschließen kann. Das SDK kann eine dateibasierte Codex-Anmeldung wiederverwenden. API keys
eignen sich 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.
Scanfehler behandeln
Fangen Sie die exportierte Fehlerklasse ab, die der Aktion entspricht, die Ihre Anwendung ausführen kann:
| 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 liegt innerhalb des gescannten Repositorys oder Worktrees. |
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 er das erforderliche Ergebnis erzeugte. |
ContractValidationError |
Ein abgeschlossener Scan hat einen Fehler im strukturierten Vertrag zurückgegeben. |
ScanInterruptedError |
Eine Unterbrechung hat den Scan gestoppt und möglicherweise eine Teilausgabe hinterlassen. |
Fahren Sie mit dem CLI-Schnellstart, dem CI- Leitfaden oder der CLI- Referenz fort.