SDK TypeScript Codex Security
Jalankan pemindaian Codex Security dari TypeScript, pilih target dan penyedia, periksa hasil, dan kelola siklus hidup pemindaian.
Gunakan SDK TypeScript Codex Security 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 atau yang lebih baru. Pemindaian juga memerlukan Python 3.10 atau yang lebih baru.
Siapkan SDK
Instal SDK:
npm install @openai/codex-securitySebelum memulai pemindaian, tetapkan OPENAI_API_KEY atau CODEX_API_KEY, gunakan proses masuk
Codex berbasis berkas yang sudah ada, atau konfigurasikan Amazon
Bedrock dengan kredensial AWS dan
penggantian model_provider serta model secara eksplisit.
Untuk hasil terbaik, gunakan akun yang diverifikasi untuk Trusted Access for Cyber. Masuk atau memberikan API key tidak memberikan Trusted Access.
Jalankan pemindaian
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 yang disegel,
dan mengembalikan ScanResult. close membebaskan runtime terisolasi dan mendukung
pemanggilan berulang.
Periksa input dengan preflight
Gunakan preflight untuk memeriksa repositori, target, mode, lokasi output, dan
konfigurasi Codex sebelum memulai pemindaian:
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);Preflight tidak mengubah runtime dan kredensial Codex. Preflight juga menyerahkan penemuan plugin dan Python kepada proses pemindaian itu sendiri. Dengan demikian, 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 membuat tujuannya sendiri yang unik. Rekam path
arsip yang sebenarnya 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.
Pilih target pemindaian
SDK mendukung target repositori, path, committed-diff, dan working-tree. Target default adalah seluruh repositori.
Pindai 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 berkas atau direktori. SDK menyelesaikan setiap path di dalam repositori dan menghapus duplikat.
Pindai 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 menggunakan HEAD secara default. Target diff mengharuskan argumen repositori
berupa root worktree Git.
Pindai 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 menggunakan HEAD secara default. Ambil revisi yang dipilih sebelum memulai
pemindaian diff atau working-tree.
Pilih 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",
});Mode mendalam mendukung target repositori dan path. Gunakan mode standar untuk pemindaian diff dan working-tree.
Tambahkan 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 berkas 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 yang disimpan.
Tetapkan 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 merupakan perkiraan, bukan batas pengeluaran mutlak. Permintaan yang sudah berlangsung
dapat selesai di atas batas tersebut. Jika pemindaian melampaui batas, SDK melempar
ScanCostLimitExceededError dan mempertahankan hasil yang tersedia.
Gunakan hasil pemindaian
ScanResult mengekspos dokumen terstruktur, metadata pemindaian, dan path
artefak:
| Properti | Isi |
|---|---|
manifest |
Manifes pemindaian yang disegel, termasuk catatan target, cakupan, produsen, dan artefak. |
findings |
Dokumen temuan. Baca objek temuan dari findings.findings. |
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. |
Gunakan temuan dan cakupan terstruktur 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);
}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, cakupan, pengidentifikasi pemindaian dan thread,
reportPath, artifactsDir, sarifPath, serta metadata giliran dalam
satu objek yang siap digunakan sebagai JSON.
Lacak atau batalkan pemindaian
Teruskan callback ScanOptions untuk melaporkan permulaan 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");
},
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);Teruskan AbortSignal ketika pembatalan berasal dari permintaan, pengontrol job,
atau timeout:
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 dihentikan dapat meninggalkan output parsial di scanDir. Pertahankan
direktori tersebut ketika hasilnya perlu diselidiki.
Aplikasi yang menampilkan progres penyiapan pemindaian juga dapat menggunakan callback siklus hidup
ScanOptions:
| Callback | Dipanggil ketika |
|---|---|
onOutputArchived(archiveDir) |
Hasil yang sudah ada dipindahkan ke direktori arsip. |
onOutputDirReady(scanDir) |
Direktori pemindaian privat siap digunakan. |
onScanStarted() |
Penyiapan pemindaian selesai dan eksekusi dimulai. |
onReconnect(attempt, maxAttempts) |
SDK mencoba kembali aliran pemindaian yang terputus. |
onWorkerStatus(status) |
Status preflight atau pengiriman worker berubah. |
onCost(cost) |
Perkiraan biaya pemindaian terbaru tersedia. |
onObserverError(observer, error) |
Callback siklus hidup pemindaian lainnya memunculkan kesalahan. |
Konfigurasikan runtime dan kredensial
Teruskan konfigurasi runtime ketika 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 atau ZIP plugin. pythonPath memilih
interpreter plugin. codexOverrides menggabungkan nilai yang didukung ke dalam konfigurasi
Codex yang 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.
Klien juga mengekspos metode autentikasi yang didukung:
| Metode | Tujuan |
|---|---|
loginApiKey(apiKey) |
Autentikasi runtime terisolasi dengan API key. |
loginChatGPT() |
Memulai alur masuk melalui browser dan mengembalikan handle login. |
loginChatGPTDeviceCode() |
Memulai alur masuk dengan 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 menyajikan dan menyelesaikan
alur masuk yang dipilih. SDK dapat menggunakan kembali proses masuk Codex berbasis berkas. API key
cocok digunakan untuk CI dan otomatisasi sisi server.
Jika API key dan proses masuk tersimpan sama-sama tersedia, SDK menggunakan API key secara default. Untuk menggunakan proses masuk ChatGPT Anda, pilih proses 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.
Tangani 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 penggantian 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 perkiraan batas biayanya. |
IncompleteScanError |
Pemindaian berakhir sebelum menghasilkan hasil yang diwajibkan. |
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.