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 wird serverseitig mit Node.js 22
(22.13.0 oder höher), 24 oder 26 ausgeführt. Für Scans ist außerdem Python 3.10 oder höher erforderlich.
Python 3.10 benötigt 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.
Verwenden Sie für optimale Ergebnisse ein Konto, das für Trusted Access for Cyber verifiziert ist. Eine Anmeldung oder die Angabe eines API key gewährt keinen Trusted Access.
Scan ausführen
Scannen Sie nur Repositories, denen Sie vertrauen und zu deren Prüfung Sie berechtigt sind. Das SDK wird mit den Berechtigungen Ihres lokalen Betriebssystems ausgeführt und hält nie für eine Genehmigung an. Scan-Prozesse können Ihre Umgebung übernehmen; entfernen Sie daher vor dem Start nicht benötigte Anmeldedaten. Siehe Berechtigungen für lokale Scans.
Erstellen Sie einen CodexSecurity-Client, 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 auslassen, speichert Codex Security die Ergebnisse in seinem eigenen persistenten
Zustandsverzeichnis. Ergebnisse können Quelltextauszüge und Details zu Sicherheitslücken
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 dessen 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, 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);Die Vorabprüfung lässt Codex-Laufzeit und Anmeldedaten unverändert. Auch die Plugin- und Python-Erkennung bleibt dem eigentlichen Scan vorbehalten. Dadurch eignet sich die Vorabprüfung zum Prüfen von Benutzereingaben vor einem lang laufenden Vorgang oder einem Vorgang mit Anmeldedaten.
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 Ausgabe- verzeichnis.
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 bereitgestellte und nicht bereitgestellte Änderungen gegenüber einer Basis-
revision 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 ist standardmäßig 96 und akzeptiert eine positive Zahl bis 96,
einschließlich Bruchteilen von Stunden. Bei Ablauf der Frist stoppt Codex Security nicht abgeschlossene
Worker, behält abgeschlossene Scan-Ergebnisse bei und fasst sie im endgültigen
Bericht zusammen. Prüfen Sie result.coverage.completeness, bevor Sie einen zeitlich begrenzten
Scan als Nachweis einer vollständigen Abdeckung betrachten.
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 jedoch keine feste Obergrenze. Bereits laufende
Anfragen können daher geringfügig darüber hinausgehen. Wenn ein Tiefenscan das Limit erreicht, nachdem
Codex Security abgeschlossene Worker-Ergebnisse zusammengefasst hat, gibt run ein Ergebnis
zurück, bei dem coverage.completeness auf "partial" gesetzt ist, und meldet die Budgetwarnung
über onWarning.
Wenn der Scan kein abgeschlossenes Teilergebnis erzeugen kann, löst run
ScanCostLimitExceededError aus und bewahrt jede verfügbare Ausgabe auf.
Mit Scan-Ergebnissen arbeiten
ScanResult stellt die strukturierten Dokumente, Scan-Metadaten und Artefakt-
pfade bereit:
| Eigenschaft | Inhalt |
|---|---|
manifest |
Das versiegelte Scan-Manifest einschließlich Ziel, Umfang, Ersteller und Artefaktdatensätzen. |
findings |
Befunde des aktuellen Scans. Lesen Sie Befundobjekte aus findings.findings. |
repositoryFindings |
Offene Befunde aus Repository-Scans, sofern ein Scan-Verlauf verfügbar ist. |
coverage |
Geprüfte Bereiche, Ausschlüsse, zurückgestellte Arbeiten, offene Fragen und Vollständigkeit. |
scanDir |
Das Scan-Verzeichnis. |
threadId |
Die Codex-Thread-ID des Scans. |
turnResult |
Turn-Status, Antwort und verfügbare Nutzungsmetadaten. |
cost |
Geschätzte Modell- und Tokenkosten 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 der unterstützenden Artefakte. |
sarifPath |
Der erzeugte SARIF-Pfad oder null, falls SARIF fehlt. |
pluginVersion |
Die vom Scan-Ersteller 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);
}Die Abdeckungsvollständigkeit 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, 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, wenn der Abbruch von einer Anfrage, einer Jobsteuerung
oder einem Timeout ausgeht:
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 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 nicht redigierte Ereignisse, 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 bestimmte 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 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 Anmeldevorgang darstellen und abschließen kann. Das SDK kann eine dateibasierte Codex-Anmeldung wiederverwenden. API keys
eignen sich gut 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.