Codex Security TypeScript SDK
Jalankan pemindaian Codex Security dari TypeScript, pilih target dan penyedia, periksa hasil, dan kelola siklus hidup pemindaian.
Gunakan Codex Security TypeScript SDK untuk menjalankan pemindaian keamanan pada repositori dan perubahan kode dari aplikasi atau alat pengembang Anda. SDK mengembalikan temuan bertipe, detail cakupan, dan path menuju artefak pemindaian. Untuk pemindaian yang lebih lama, SDK mendukung pemeriksaan preflight, batas biaya, callback progres, dan pembatalan.
SDK menggunakan modul ECMAScript (ESM) dan berjalan di sisi server dengan Node.js 22
(22.13.0 atau yang lebih baru), 24, atau 26. Pemindaian juga memerlukan Python 3.10 atau yang lebih baru.
Python 3.10 juga memerlukan paket tomli.
Menyiapkan SDK
Instal SDK:
npm install @openai/codex-securitySebelum memulai pemindaian, tetapkan OPENAI_API_KEY atau CODEX_API_KEY, gunakan
login Codex berbasis file yang sudah ada, atau konfigurasikan penyedia
lain. Amazon Bedrock menggunakan kredensial AWS;
OpenRouter dan Fireworks menggunakan API key serta konfigurasi khusus penyedia.
Untuk hasil terbaik, gunakan akun yang diverifikasi untuk Trusted Access for Cyber. Login atau memberikan API key tidak memberikan Trusted Access.
Menjalankan pemindaian
Pindai hanya repositori yang Anda percayai dan boleh Anda nilai. SDK berjalan dengan izin sistem operasi lokal Anda dan tidak pernah berhenti untuk meminta persetujuan. Proses pemindaian dapat mewarisi lingkungan Anda, jadi hapus kredensial yang tidak terkait sebelum memulai. Lihat Izin pemindaian lokal.
Buat satu klien CodexSecurity, jalankan pemindaian repositori standar, lalu tutup
klien setelah pekerjaan selesai. Teruskan outputDir untuk memilih direktori
hasil privat di luar worktree Git yang menaunginya.
Jika Anda menghilangkan outputDir, Codex Security menyimpan hasil dalam direktori
status persistennya sendiri. Hasil dapat mencakup kutipan kode sumber dan detail
kerentanan, jadi pilih izin dan kebijakan retensi yang sesuai.
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 memulai pemindaian, menunggu hingga selesai, memvalidasi artefak tersegel,
dan mengembalikan ScanResult. close melepaskan runtime terisolasi dan mendukung
pemanggilan berulang.
Memeriksa input dengan preflight
Gunakan preflight untuk memeriksa repositori, target, mode, dokumen basis pengetahuan,
lokasi output, dan konfigurasi Codex sebelum memulai pemindaian:
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 tidak mengubah runtime Codex maupun kredensial. Preflight juga menyerahkan penemuan plugin dan Python kepada pemindaian itu sendiri. Hal ini membuat preflight berguna untuk memeriksa input pengguna sebelum operasi yang berjalan lama atau menggunakan kredensial.
Untuk melihat pratinjau pengarsipan bagi direktori hasil yang sudah ada, tetapkan
archiveExisting: true:
const plan = await security.preflight("/path/to/repository", {
outputDir: "/path/outside/repository/results",
archiveExisting: true,
});
console.log(plan.archiveDir);archiveDir yang dikembalikan menampilkan pratinjau penamaan arsip. Path akhir dapat
berbeda karena run menghasilkan tujuannya sendiri yang unik. Rekam path
arsip aktual dengan onOutputArchived:
await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
archiveExisting: true,
onOutputArchived(archiveDir) {
console.log("Archived results:", archiveDir);
},
});Pemindaian mengarsipkan hasil sebelumnya dan memulai dengan direktori output kosong.
Memilih target pemindaian
SDK mendukung target repositori, path, diff yang telah di-commit, dan working tree. Target default adalah seluruh repositori.
Memindai path yang dipilih
Teruskan array path di dalam repositori:
const result = await security.run("/path/to/repository", {
target: ["services/billing", "packages/auth"],
});Path dapat mengidentifikasi file atau direktori. SDK me-resolve setiap path di dalam repositori dan menghapus duplikat.
Memindai perubahan yang telah di-commit
Gunakan DiffTarget.refs untuk memindai perubahan yang telah di-commit di antara dua
revisi Git yang tersedia secara lokal:
const target = DiffTarget.refs({
base: "origin/main",
head: "HEAD",
});
const result = await security.run("/path/to/repository", { target });Head secara default adalah HEAD. Target diff mengharuskan argumen repositori
berupa root worktree Git.
Memindai working tree
Gunakan DiffTarget.workingTree untuk memindai perubahan staged dan unstaged terhadap revisi
base:
const target = DiffTarget.workingTree({ base: "HEAD" });
const result = await security.run("/path/to/repository", { target });Base secara default adalah HEAD. Ambil revisi yang dipilih sebelum memulai
pemindaian diff atau working tree.
Memilih mode mendalam
Tetapkan mode: "deep" untuk pemindaian repositori atau path yang memerlukan peninjauan lebih luas:
const result = await security.run("/path/to/repository", {
target: ["services/billing"],
mode: "deep",
workers: 2,
subagents: 0,
stopAfterNoNew: 3,
maxDiscoveryRuns: 10,
maxTimeHours: 1.5,
});Mode mendalam mendukung target repositori dan path. Gunakan mode standar untuk pemindaian diff dan
working tree. Pengaturan opsional mengontrol worker pemindaian standar independen yang berjalan bersamaan,
subagen per worker, jumlah pemindaian worker selesai berturut-turut
tanpa temuan baru, serta jumlah total dan durasi proses worker. Pengaturan tersebut
memerlukan mode: "deep".
maxTimeHours secara default adalah 96 dan menerima angka positif hingga 96,
termasuk pecahan jam. Saat tenggat tercapai, Codex Security menghentikan worker yang belum
selesai, mempertahankan hasil pemindaian yang telah selesai, dan mengagregasikannya ke dalam laporan
akhir. Tinjau result.coverage.completeness sebelum menganggap pemindaian dengan batas waktu
sebagai bukti cakupan penuh.
Menambahkan basis pengetahuan keamanan
Teruskan dokumen arsitektur, model ancaman, atau kebijakan keamanan melalui
knowledgeBasePaths:
const result = await security.run("/path/to/repository", {
knowledgeBasePaths: [
"/path/to/architecture.md",
"/path/to/security-policies",
],
});SDK menerima file atau direktori dan menelusuri direktori secara rekursif.
Format dokumen yang didukung adalah .md, .markdown, .txt, .pdf, dan .docx.
SDK menolak path input tertaut, melewati entri direktori tertaut, dan menyimpan
konten dokumen yang diekstrak di luar hasil pemindaian tersimpan.
Menambahkan instruksi pemindaian dan tindak lanjut
Gunakan scanPrompt untuk memfokuskan pemindaian dan postScanPrompt untuk meminta tindak lanjut:
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.",
});Jika tindak lanjut gagal, SDK mempertahankan pemindaian yang telah selesai dan melaporkan
kesalahan melalui onWarning. SDK memulihkan setiap artefak pemindaian selesai yang
diubah oleh tindak lanjut.
Menetapkan anggaran pemindaian
Tetapkan maxCostUsd untuk menghentikan pemindaian ketika perkiraan biaya modelnya melampaui batas.
Gunakan onCost untuk melacak biaya selama pemindaian berjalan:
const result = await security.run("/path/to/repository", {
maxCostUsd: 5,
onCost(cost) {
console.log(cost.estimatedUsd);
},
});
console.log(result.cost?.estimatedUsd);Batas tersebut memperkirakan pengeluaran, tetapi bukan batas mutlak, sehingga permintaan yang sudah
berjalan dapat selesai sedikit di atasnya. Jika pemindaian mendalam mencapai batas setelah
Codex Security mengagregasikan hasil worker yang selesai, run mengembalikan hasil
dengan coverage.completeness ditetapkan ke "partial" dan melaporkan peringatan anggaran
melalui onWarning.
Jika pemindaian tidak dapat menghasilkan hasil parsial yang selesai, run melempar
ScanCostLimitExceededError dan mempertahankan semua output yang tersedia.
Menggunakan hasil pemindaian
ScanResult mengekspos dokumen terstruktur, metadata pemindaian, dan path
artefak:
| Properti | Isi |
|---|---|
manifest |
Manifes pemindaian tersegel, termasuk catatan target, cakupan, produsen, dan artefak. |
findings |
Temuan dari pemindaian saat ini. Baca objek temuan dari findings.findings. |
repositoryFindings |
Temuan terbuka dari seluruh pemindaian repositori, jika riwayat pemindaian tersedia. |
coverage |
Permukaan yang ditinjau, pengecualian, pekerjaan yang ditangguhkan, pertanyaan terbuka, dan kelengkapan. |
scanDir |
Direktori pemindaian. |
threadId |
Pengidentifikasi thread Codex untuk pemindaian. |
turnResult |
Status giliran, respons, dan metadata penggunaan yang tersedia. |
cost |
Perkiraan biaya model dan token, atau null jika tidak tersedia. |
reportPath |
Path menuju report.md. |
manifestPath |
Path menuju scan-manifest.json. |
findingsPath |
Path menuju findings.json. |
coveragePath |
Path menuju coverage.json. |
artifactsDir |
Direktori artefak pendukung. |
sarifPath |
Path SARIF yang dihasilkan, atau null jika SARIF tidak ada. |
pluginVersion |
Versi yang dicatat oleh produsen pemindaian. |
Untuk mewajibkan plugin yang sama bagi pemindaian berikutnya, teruskan
expectedPluginVersion: result.pluginVersion. SDK menolak pemindaian jika
versi plugin yang terinstal berbeda.
Gunakan temuan terstruktur dan cakupan secara langsung:
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);
}Temuan dapat menyertakan bidang opsional codeEvidence, rootCause, validation,
attackPath, remediationTests, dan preventiveControls.
Untuk temuan di seluruh repositori, confirmedInLatestScan membedakan temuan
yang terlihat dalam pemindaian terbaru dari temuan sebelumnya yang masih terbuka:
for (const finding of result.repositoryFindings ?? []) {
console.log(finding.title, finding.confirmedInLatestScan);
}Kelengkapan cakupan adalah complete, partial, atau unknown. Tinjau permukaan yang ditangguhkan,
pengecualian, dan pertanyaan terbuka sebelum menggunakan pemindaian sebagai bukti untuk
keputusan keamanan.
result.toJSON() mengembalikan manifes, temuan repositori dan pemindaian saat ini,
cakupan, pengidentifikasi pemindaian dan thread, reportPath, artifactsDir,
sarifPath, biaya, serta metadata giliran dalam satu objek yang siap untuk JSON.
Melacak atau membatalkan pemindaian
Teruskan callback ScanOptions untuk melaporkan dimulainya pemindaian, progres worker, dan
percobaan ulang koneksi:
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);Teruskan AbortSignal ketika pembatalan berasal dari permintaan, pengontrol job,
atau batas waktu:
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;
}
}Pemindaian yang diinterupsi dapat meninggalkan output parsial di scanDir. Pertahankan
direktori tersebut jika hasilnya perlu diselidiki.
Aplikasi yang menampilkan progres penyiapan pemindaian juga dapat menggunakan callback siklus hidup
ScanOptions:
| Callback | Dipanggil ketika |
|---|---|
onAuthentication(authentication) |
Pemindaian memilih metode autentikasinya. |
onOutputArchived(archiveDir) |
Hasil yang sudah ada dipindahkan ke direktori arsip. |
onOutputDirReady(scanDir) |
Direktori pemindaian privat siap digunakan. |
onScanStarted() |
Penyiapan pemindaian selesai dan eksekusi dimulai. |
onTrustedAccessStatus(status) |
Status Trusted Access tersedia. |
onReconnect(attempt, maxAttempts) |
SDK mencoba kembali aliran pemindaian yang terputus. |
onActivity(activity) |
Perintah, alat, langkah penalaran, atau pesan diperbarui. |
onProgress(progress) |
Fase pemindaian atau jumlah file yang ditinjau berubah. |
onWorkerStatus(status) |
Status preflight atau dispatch worker berubah. |
onSessionEvent(session) |
Sesi pemindaian atau worker menghasilkan peristiwa. |
onCost(cost) |
Perkiraan biaya pemindaian terbaru tersedia. |
onWarning(warning) |
Pemindaian melaporkan peringatan. |
onObserverError(observer, error) |
Callback siklus hidup pemindaian lain memunculkan kesalahan. |
Status Trusted Access adalah granted, not_granted, atau unknown. Akses yang tidak ada atau
tidak diketahui juga memicu onWarning.
onSessionEvent menerima peristiwa yang tidak disunting dan dapat berisi kode sumber
atau kredensial. Filter peristiwa tersebut sebelum mengirimkannya ke log bersama atau layanan
lain.
Mengonfigurasi runtime dan kredensial
Teruskan konfigurasi runtime saat Anda memerlukan plugin, interpreter, atau pengaturan Codex tertentu:
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 menerima direktori plugin atau ZIP. pythonPath memilih
interpreter plugin. codexOverrides menggabungkan nilai yang didukung ke dalam konfigurasi
Codex terisolasi. Secara default, pemindaian menggunakan gpt-5.6-sol dengan upaya penalaran extra-high.
Tetapkan model dan model_reasoning_effort dalam codexOverrides untuk menggunakan
model atau upaya penalaran yang berbeda. Untuk menggunakan Amazon
Bedrock, tetapkan
model_provider dan model dalam codexOverrides.
codexOverrides tidak dapat membatasi akses sistem file pemindaian atau mengubah
kebijakan persetujuannya. Lihat Izin pemindaian
lokal.
Untuk OpenRouter atau Fireworks, berikan juga API key yang sesuai dan konfigurasi
penyedia lengkap dalam codexOverrides. Misalnya, tetapkan
OPENROUTER_API_KEY dan konfigurasikan 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",
},
},
},
});Untuk Fireworks, ubah kedua key openrouter menjadi fireworks, tetapkan name ke
Fireworks AI, tetapkan env_key ke FIREWORKS_API_KEY, gunakan
https://api.fireworks.ai/inference/v1 sebagai base_url, dan pilih model Fireworks.
Klien juga mengekspos metode autentikasi yang didukung:
| Metode | Tujuan |
|---|---|
loginApiKey(apiKey) |
Mengautentikasi runtime terisolasi dengan API key. |
loginChatGPT() |
Memulai alur login browser dan mengembalikan handle login. |
loginChatGPTDeviceCode() |
Memulai alur login kode perangkat dan mengembalikan handle login. |
account() |
Mengembalikan status autentikasi saat ini. |
logout() |
Menghapus autentikasi terisolasi. |
Handle login menyediakan waitForInstructions, authUrl, verificationUrl,
userCode, wait, dan cancel agar aplikasi dapat menampilkan dan menyelesaikan
alur login yang dipilih. SDK dapat menggunakan kembali login Codex berbasis file. API key
cocok digunakan untuk CI dan otomatisasi sisi server.
Jika API key dan login tersimpan sama-sama tersedia, SDK menggunakan API key secara default. Untuk menggunakan login ChatGPT Anda, pilih login tersebut untuk pemindaian:
const result = await security.run("/path/to/repository", {
auth: "chatgpt",
});Tetapkan auth: "api-key" untuk mewajibkan API key dari lingkungan. preflight menerima
opsi auth yang sama.
Menangani kesalahan pemindaian
Tangkap kelas kesalahan yang diekspor dan sesuai dengan tindakan yang dapat dilakukan aplikasi Anda:
| Kesalahan | Arti |
|---|---|
AuthenticationRequiredError |
Pemindaian memerlukan kredensial yang didukung. |
ConfigurationError |
Konfigurasi Codex atau override tidak sesuai. |
InvalidTargetError |
Repositori, path, mode, atau target Git tidak sesuai. |
OutputDirectoryError |
Lokasi output atau izinnya tidak sesuai. |
OutputInsideProtectedRootError |
Direktori output berada di dalam repositori atau worktree yang dipindai. |
PluginPythonUnavailableError |
Interpreter Python yang dapat digunakan tidak tersedia. |
PluginBootstrapError |
Runtime plugin tidak dapat dimulai. |
ScanCostLimitExceededError |
Pemindaian melampaui batas perkiraan biayanya. |
IncompleteScanError |
Pemindaian berakhir sebelum menghasilkan hasil yang diperlukan. |
ContractValidationError |
Pemindaian yang selesai mengembalikan kesalahan kontrak terstruktur. |
ScanInterruptedError |
Interupsi menghentikan pemindaian dan mungkin meninggalkan output parsial. |
Lanjutkan dengan panduan mulai cepat CLI, panduan CI, atau referensi CLI.