Español

SDK de TypeScript de Codex Security

Ejecuta análisis de Codex Security desde TypeScript, selecciona objetivos y proveedores, inspecciona los resultados y gestiona el ciclo de vida de los análisis.

Usa el SDK de TypeScript de Codex Security para ejecutar análisis de seguridad en repositorios y cambios de código desde tu aplicación o herramienta para desarrolladores. El SDK devuelve hallazgos tipados, detalles de cobertura y rutas a los artefactos del análisis. Para análisis más largos, admite comprobaciones previas, límites de costes, devoluciones de llamada de progreso y cancelación.

El SDK utiliza módulos ECMAScript (ESM) y se ejecuta en el servidor con Node.js 22 o posterior. El análisis también requiere Python 3.10 o posterior.

Configurar el SDK

Instala el SDK:

npm install @openai/codex-security

Antes de iniciar un análisis, establece OPENAI_API_KEY o CODEX_API_KEY, usa un inicio de sesión existente de Codex respaldado por archivos o configura Amazon Bedrock con credenciales de AWS y reemplazos explícitos de model_provider y model.

Para obtener los mejores resultados, usa una cuenta verificada para Trusted Access for Cyber. Iniciar sesión o proporcionar una API key no concede Trusted Access.

Ejecutar un análisis

Crea un cliente CodexSecurity, ejecuta un análisis estándar del repositorio y cierra el cliente cuando finalice el trabajo. Pasa outputDir para elegir un directorio privado de resultados fuera del árbol de trabajo de Git contenedor.

Si omites outputDir, Codex Security guarda los resultados en su propio directorio de estado persistente. Los resultados pueden incluir extractos del código fuente y detalles de vulnerabilidades, por lo que debes elegir permisos y políticas de conservación adecuados.



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 inicia el análisis, espera a que finalice, valida los artefactos sellados y devuelve un ScanResult. close libera el entorno de ejecución aislado y admite llamadas repetidas.

Comprobar las entradas mediante la comprobación previa

Usa preflight para comprobar un repositorio, objetivo, modo, ubicación de salida y configuración de Codex antes de iniciar un análisis:

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);

La comprobación previa no modifica el entorno de ejecución ni las credenciales de Codex. También deja el descubrimiento de complementos y Python para el propio análisis. Esto hace que la comprobación previa resulte útil para comprobar la entrada del usuario antes de una operación larga o que requiera credenciales.

Para obtener una vista previa del archivado de un directorio de resultados existente, establece archiveExisting: true:

const plan = await security.preflight("/path/to/repository", {
  outputDir: "/path/outside/repository/results",
  archiveExisting: true,
});

console.log(plan.archiveDir);

El archiveDir devuelto muestra una vista previa del nombre del archivo. La ruta final puede ser distinta porque run genera su propio destino único. Captura la ruta real del archivo con onOutputArchived:

await security.run("/path/to/repository", {
  outputDir: "/path/outside/repository/results",
  archiveExisting: true,
  onOutputArchived(archiveDir) {
    console.log("Archived results:", archiveDir);
  },
});

El análisis archiva los resultados anteriores y comienza con un directorio de salida vacío.

Elegir un objetivo de análisis

El SDK admite como objetivos repositorios, rutas, diferencias confirmadas y árboles de trabajo. El objetivo predeterminado es el repositorio completo.

Analizar rutas seleccionadas

Pasa una matriz de rutas del repositorio:

const result = await security.run("/path/to/repository", {
  target: ["services/billing", "packages/auth"],
});

Las rutas pueden identificar archivos o directorios. El SDK resuelve cada ruta dentro del repositorio y elimina los duplicados.

Analizar cambios confirmados

Usa DiffTarget.refs para analizar los cambios confirmados entre dos revisiones de Git disponibles localmente:



const target = DiffTarget.refs({
  base: "origin/main",
  head: "HEAD",
});

const result = await security.run("/path/to/repository", { target });

La cabecera usa HEAD de forma predeterminada. Los objetivos de diferencias requieren que el argumento del repositorio sea la raíz del árbol de trabajo de Git.

Analizar el árbol de trabajo

Usa DiffTarget.workingTree para analizar los cambios preparados y no preparados respecto a una revisión base:

const target = DiffTarget.workingTree({ base: "HEAD" });
const result = await security.run("/path/to/repository", { target });

La base usa HEAD de forma predeterminada. Obtén las revisiones seleccionadas antes de iniciar un análisis de diferencias o del árbol de trabajo.

Seleccionar el modo profundo

Establece mode: "deep" para un análisis de repositorio o ruta que necesite una revisión más amplia:

const result = await security.run("/path/to/repository", {
  target: ["services/billing"],
  mode: "deep",
});

El modo profundo admite objetivos de repositorio y ruta. Usa el modo estándar para los análisis de diferencias y del árbol de trabajo.

Añadir una base de conocimientos de seguridad

Pasa documentos de arquitectura, modelos de amenazas o políticas de seguridad mediante knowledgeBasePaths:

const result = await security.run("/path/to/repository", {
  knowledgeBasePaths: [
    "/path/to/architecture.md",
    "/path/to/security-policies",
  ],
});

El SDK acepta archivos o directorios y busca en los directorios de forma recursiva. Los formatos de documento admitidos son .md, .markdown, .txt, .pdf y .docx. El SDK rechaza las rutas de entrada enlazadas, omite las entradas enlazadas de directorios y mantiene el contenido extraído de los documentos fuera de los resultados guardados del análisis.

Establecer un presupuesto de análisis

Establece maxCostUsd para detener un análisis cuando el coste estimado del modelo supere un límite. Usa onCost para hacer un seguimiento del coste mientras se ejecuta el análisis:

const result = await security.run("/path/to/repository", {
  maxCostUsd: 5,
  onCost(cost) {
    console.log(cost.estimatedUsd);
  },
});

console.log(result.cost?.estimatedUsd);

El límite es una estimación, no un tope estricto de gasto. Las solicitudes ya en curso pueden finalizar por encima de él. Si el análisis supera el límite, el SDK produce ScanCostLimitExceededError y conserva los resultados disponibles.

Trabajar con los resultados del análisis

ScanResult expone los documentos estructurados, los metadatos del análisis y las rutas de los artefactos:

Propiedad Contenido
manifest El manifiesto sellado del análisis, incluidos el objetivo, el alcance, el productor y los registros de artefactos.
findings El documento de hallazgos. Lee los objetos de hallazgo en findings.findings.
coverage Superficies revisadas, exclusiones, trabajo aplazado, preguntas abiertas y exhaustividad.
scanDir El directorio del análisis.
threadId El identificador del hilo de Codex del análisis.
turnResult Estado del turno, respuesta y metadatos de uso disponibles.
cost Coste estimado del modelo y de los tokens, o null cuando no está disponible.
reportPath La ruta a report.md.
manifestPath La ruta a scan-manifest.json.
findingsPath La ruta a findings.json.
coveragePath La ruta a coverage.json.
artifactsDir El directorio de artefactos auxiliares.
sarifPath La ruta del archivo SARIF generado, o null cuando no hay SARIF.
pluginVersion La versión registrada por el productor del análisis.

Usa directamente los hallazgos estructurados y la cobertura:

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);
}

La exhaustividad de la cobertura es complete, partial o unknown. Revisa las superficies aplazadas, las exclusiones y las preguntas abiertas antes de usar un análisis como prueba para una decisión de seguridad.

result.toJSON() devuelve el manifiesto, los hallazgos, la cobertura, los identificadores del análisis y del hilo, reportPath, artifactsDir, sarifPath y los metadatos del turno en un objeto listo para JSON.

Seguir o cancelar un análisis

Pasa devoluciones de llamada ScanOptions para informar del inicio del análisis, el progreso de los procesos de trabajo y los reintentos de conexión:

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);

Pasa un AbortSignal cuando la cancelación proceda de una solicitud, un controlador de trabajos o un tiempo de espera:



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;
  }
}

Un análisis interrumpido puede dejar una salida parcial en scanDir. Conserva ese directorio cuando sea necesario investigar el resultado.

Las aplicaciones que muestran el progreso de configuración del análisis también pueden usar las devoluciones de llamada del ciclo de vida ScanOptions:

Devolución de llamada Se invoca cuando
onOutputArchived(archiveDir) Los resultados existentes se trasladan al directorio de archivo.
onOutputDirReady(scanDir) El directorio privado del análisis está listo.
onScanStarted() Finaliza la configuración del análisis y comienza la ejecución.
onReconnect(attempt, maxAttempts) El SDK reintenta un flujo de análisis desconectado.
onWorkerStatus(status) Cambia el estado de comprobación previa o distribución del proceso de trabajo.
onCost(cost) Está disponible un coste estimado actualizado del análisis.
onObserverError(observer, error) Otra devolución de llamada del ciclo de vida del análisis genera un error.

Configurar el entorno de ejecución y las credenciales

Pasa la configuración del entorno de ejecución cuando necesites un complemento, intérprete o ajuste de Codex específico:

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 acepta un directorio o ZIP de complemento. pythonPath selecciona el intérprete del complemento. codexOverrides combina los valores admitidos con la configuración aislada de Codex. Los análisis usan gpt-5.6-sol con un esfuerzo de razonamiento extraalto de forma predeterminada. Establece model y model_reasoning_effort en codexOverrides para usar un modelo o esfuerzo de razonamiento distinto. Para usar Amazon Bedrock, establece model_provider y model en codexOverrides.

El cliente también expone métodos de autenticación admitidos:

Método Finalidad
loginApiKey(apiKey) Autenticar el entorno de ejecución aislado con una API key.
loginChatGPT() Iniciar un flujo de inicio de sesión en el navegador y devolver un identificador de inicio de sesión.
loginChatGPTDeviceCode() Iniciar un flujo de inicio de sesión mediante código de dispositivo y devolver un identificador de inicio de sesión.
account() Devolver el estado de autenticación actual.
logout() Borrar la autenticación aislada.

Un identificador de inicio de sesión proporciona waitForInstructions, authUrl, verificationUrl, userCode, wait y cancel para que una aplicación pueda presentar y completar el flujo de inicio de sesión seleccionado. El SDK puede reutilizar un inicio de sesión de Codex respaldado por archivos. Las API key son adecuadas para CI y la automatización del lado del servidor.

Cuando están disponibles tanto una API key como un inicio de sesión almacenado, el SDK usa de forma predeterminada la API key. Para usar en su lugar tu inicio de sesión de ChatGPT, selecciónalo para el análisis:

const result = await security.run("/path/to/repository", {
  auth: "chatgpt",
});

Establece auth: "api-key" para exigir una API key del entorno. preflight acepta la misma opción auth.

Gestionar los errores de análisis

Captura la clase de error exportada que coincida con la acción que tu aplicación pueda realizar:

Error Significado
AuthenticationRequiredError Un análisis necesita una credencial admitida.
ConfigurationError La configuración de Codex o un reemplazo no son adecuados.
InvalidTargetError El repositorio, la ruta, el modo o el objetivo de Git no son adecuados.
OutputDirectoryError La ubicación de salida o sus permisos no son adecuados.
OutputInsideProtectedRootError El directorio de salida está dentro del repositorio o árbol de trabajo analizado.
PluginPythonUnavailableError No hay disponible un intérprete de Python utilizable.
PluginBootstrapError No se pudo iniciar el entorno de ejecución del complemento.
ScanCostLimitExceededError El análisis superó su límite de coste estimado.
IncompleteScanError El análisis finalizó antes de generar el resultado requerido.
ContractValidationError Un análisis completado devolvió un error del contrato estructurado.
ScanInterruptedError Una interrupción detuvo el análisis y puede haber dejado una salida parcial.

Continúa con la guía de inicio rápido de la CLI, la guía de CI o la referencia de la CLI.