SDK TypeScript do Codex Security
Execute análises do Codex Security a partir de TypeScript, selecione alvos e fornecedores, inspecione resultados e faça a gestão do ciclo de vida das análises.
Utilize o SDK TypeScript do Codex Security para executar análises de segurança em repositórios e alterações de código a partir da sua aplicação ou ferramenta de desenvolvimento. O SDK devolve deteções tipificadas, detalhes de cobertura e caminhos para os artefactos da análise. Para análises mais demoradas, suporta verificações preliminares, limites de custos, callbacks de progresso e cancelamento.
O SDK utiliza módulos ECMAScript (ESM) e é executado no servidor com Node.js 22
(22.13.0 ou posterior), 24 ou 26. A análise também requer Python 3.10 ou posterior.
O Python 3.10 também requer o pacote tomli.
Configurar o SDK
Instale o SDK:
npm install @openai/codex-securityAntes de iniciar uma análise, defina OPENAI_API_KEY ou CODEX_API_KEY, utilize um
início de sessão existente do Codex baseado em ficheiros ou configure outro
fornecedor. O Amazon Bedrock utiliza credenciais da AWS;
o OpenRouter e o Fireworks utilizam API keys e configurações específicas do fornecedor.
Para obter os melhores resultados, utilize uma conta verificada para Trusted Access for Cyber. Iniciar sessão ou fornecer uma API key não concede Trusted Access.
Executar uma análise
Analise apenas repositórios nos quais confia e que tem autorização para avaliar. O SDK é executado com as permissões locais do seu sistema operativo e nunca aguarda aprovação. Os processos de análise podem herdar o seu ambiente, pelo que deve remover credenciais não relacionadas antes de começar. Consulte Permissões de análise local.
Crie um cliente CodexSecurity, execute uma análise normal do repositório e feche
o cliente quando o trabalho terminar. Transmita outputDir para escolher um diretório privado
de resultados fora da árvore de trabalho do Git envolvente.
Se omitir outputDir, o Codex Security guarda os resultados no seu próprio diretório persistente
de estado. Os resultados podem incluir excertos de código-fonte e detalhes de vulnerabilidades,
pelo que deve escolher permissões e políticas de retenção adequadas.
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 a análise, aguarda a conclusão, valida os artefactos selados
e devolve um ScanResult. close liberta o runtime isolado e suporta
chamadas repetidas.
Verificar entradas com a análise preliminar
Utilize preflight para verificar um repositório, alvo, modo, documentos da base de conhecimentos,
localização de saída e configuração do Codex antes de iniciar uma análise:
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);A análise preliminar não altera o runtime nem as credenciais do Codex. Também deixa a deteção do plugin e do Python para a própria análise. Isto torna a análise preliminar útil para verificar dados introduzidos pelo utilizador antes de uma operação demorada ou com credenciais.
Para pré-visualizar o arquivamento de um diretório de resultados existente, defina
archiveExisting: true:
const plan = await security.preflight("/path/to/repository", {
outputDir: "/path/outside/repository/results",
archiveExisting: true,
});
console.log(plan.archiveDir);O archiveDir devolvido pré-visualiza a nomenclatura do arquivamento. O caminho final pode
ser diferente porque run gera o seu próprio destino exclusivo. Capture o caminho real
do arquivamento com onOutputArchived:
await security.run("/path/to/repository", {
outputDir: "/path/outside/repository/results",
archiveExisting: true,
onOutputArchived(archiveDir) {
console.log("Archived results:", archiveDir);
},
});A análise arquiva os resultados anteriores e começa com um diretório de saída vazio.
Escolher um alvo de análise
O SDK suporta alvos de repositório, caminho, diferenças consolidadas e árvore de trabalho. O alvo predefinido é o repositório completo.
Analisar caminhos selecionados
Transmita uma matriz de caminhos dentro do repositório:
const result = await security.run("/path/to/repository", {
target: ["services/billing", "packages/auth"],
});Os caminhos podem identificar ficheiros ou diretórios. O SDK resolve cada caminho dentro do repositório e remove duplicados.
Analisar alterações consolidadas
Utilize DiffTarget.refs para analisar alterações consolidadas entre duas revisões do
Git disponíveis localmente:
const target = DiffTarget.refs({
base: "origin/main",
head: "HEAD",
});
const result = await security.run("/path/to/repository", { target });Por predefinição, a origem é HEAD. Os alvos de diferenças requerem que o argumento do repositório
seja a raiz da árvore de trabalho do Git.
Analisar a árvore de trabalho
Utilize DiffTarget.workingTree para analisar alterações preparadas e não preparadas em relação a uma revisão
de base:
const target = DiffTarget.workingTree({ base: "HEAD" });
const result = await security.run("/path/to/repository", { target });Por predefinição, a base é HEAD. Obtenha as revisões selecionadas antes de iniciar uma
análise de diferenças ou da árvore de trabalho.
Selecionar o modo aprofundado
Defina mode: "deep" para uma análise de repositório ou caminho que necessite de uma revisão mais abrangente:
const result = await security.run("/path/to/repository", {
target: ["services/billing"],
mode: "deep",
workers: 2,
subagents: 0,
stopAfterNoNew: 3,
maxDiscoveryRuns: 10,
maxTimeHours: 1.5,
});O modo aprofundado suporta alvos de repositório e caminho. Utilize o modo normal para análises de diferenças e
da árvore de trabalho. As definições opcionais controlam os trabalhadores simultâneos e independentes
de análise normal, os subagentes por trabalhador, as análises consecutivas concluídas pelo trabalhador
sem novas deteções e o número total e a duração das execuções dos trabalhadores. Requerem
mode: "deep".
Por predefinição, maxTimeHours é 96 e aceita um número positivo até 96,
incluindo frações de hora. No prazo limite, o Codex Security interrompe os trabalhadores inacabados,
conserva os resultados das análises concluídas e agrega-os no relatório
final. Reveja result.coverage.completeness antes de considerar uma análise com limite de tempo
como prova de cobertura completa.
Adicionar uma base de conhecimentos de segurança
Transmita documentos de arquitetura, modelos de ameaças ou políticas de segurança através de
knowledgeBasePaths:
const result = await security.run("/path/to/repository", {
knowledgeBasePaths: [
"/path/to/architecture.md",
"/path/to/security-policies",
],
});O SDK aceita ficheiros ou diretórios e pesquisa diretórios recursivamente.
Os formatos de documento suportados são .md, .markdown, .txt, .pdf e .docx.
O SDK rejeita caminhos de entrada ligados, ignora entradas de diretório ligadas e mantém
o conteúdo extraído dos documentos fora dos resultados de análise guardados.
Adicionar instruções de análise e acompanhamento
Utilize scanPrompt para orientar a análise e postScanPrompt para solicitar um acompanhamento:
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.",
});Se o acompanhamento falhar, o SDK conserva a análise concluída e comunica o
erro através de onWarning. Restaura quaisquer artefactos da análise concluída que o
acompanhamento tenha alterado.
Definir um orçamento de análise
Defina maxCostUsd para interromper uma análise quando o custo estimado do modelo exceder um limite.
Utilize onCost para acompanhar o custo durante a análise:
const result = await security.run("/path/to/repository", {
maxCostUsd: 5,
onCost(cost) {
console.log(cost.estimatedUsd);
},
});
console.log(result.cost?.estimatedUsd);O limite estima a despesa, mas não é um limite rígido, pelo que os pedidos já em
curso podem terminar ligeiramente acima do mesmo. Se uma análise aprofundada atingir o limite depois de
o Codex Security agregar os resultados concluídos dos trabalhadores, run devolve um resultado
com coverage.completeness definido como "partial" e comunica o aviso de orçamento
através de onWarning.
Se a análise não conseguir produzir um resultado parcial concluído, run lança
ScanCostLimitExceededError e preserva qualquer saída disponível.
Trabalhar com resultados de análises
ScanResult expõe os documentos estruturados, os metadados da análise e os caminhos
dos artefactos:
| Propriedade | Conteúdo |
|---|---|
manifest |
O manifesto selado da análise, incluindo o alvo, âmbito, produtor e registos de artefactos. |
findings |
Deteções da análise atual. Leia os objetos de deteção em findings.findings. |
repositoryFindings |
Deteções abertas nas análises do repositório, quando o histórico de análises está disponível. |
coverage |
Superfícies revistas, exclusões, trabalho adiado, questões em aberto e completude. |
scanDir |
O diretório da análise. |
threadId |
O identificador do tópico do Codex para a análise. |
turnResult |
Estado do turno, resposta e metadados de utilização disponíveis. |
cost |
Custo estimado do modelo e dos tokens, ou null quando indisponível. |
reportPath |
O caminho para report.md. |
manifestPath |
O caminho para scan-manifest.json. |
findingsPath |
O caminho para findings.json. |
coveragePath |
O caminho para coverage.json. |
artifactsDir |
O diretório de artefactos de suporte. |
sarifPath |
O caminho SARIF gerado, ou null quando não existe SARIF. |
pluginVersion |
A versão registada pelo produtor da análise. |
Para exigir o mesmo plugin numa análise posterior, transmita
expectedPluginVersion: result.pluginVersion. O SDK rejeita a análise se
a versão do plugin instalado for diferente.
Utilize diretamente as deteções estruturadas e a 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);
}As deteções podem incluir os campos opcionais codeEvidence, rootCause, validation,
attackPath, remediationTests e preventiveControls.
Para deteções em todo o repositório, confirmedInLatestScan distingue as deteções
observadas na análise mais recente das deteções anteriores que permanecem abertas:
for (const finding of result.repositoryFindings ?? []) {
console.log(finding.title, finding.confirmedInLatestScan);
}A completude da cobertura é complete, partial ou unknown. Reveja as superfícies
adiadas, exclusões e questões em aberto antes de utilizar uma análise como prova para uma
decisão de segurança.
result.toJSON() devolve o manifesto, as deteções do repositório e da análise atual,
a cobertura, os identificadores da análise e do tópico, reportPath, artifactsDir,
sarifPath, o custo e os metadados do turno num único objeto preparado para JSON.
Acompanhar ou cancelar uma análise
Transmita callbacks ScanOptions para comunicar o início da análise, o progresso dos trabalhadores e
as novas tentativas de ligação:
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);Transmita um AbortSignal quando o cancelamento provier de um pedido, controlador de tarefas
ou tempo limite:
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;
}
}Uma análise interrompida pode deixar uma saída parcial em scanDir. Preserve esse
diretório quando for necessário investigar o resultado.
As aplicações que apresentam o progresso da configuração da análise também podem utilizar os callbacks de
ciclo de vida ScanOptions:
| Callback | Chamado quando |
|---|---|
onAuthentication(authentication) |
A análise seleciona o respetivo método de autenticação. |
onOutputArchived(archiveDir) |
Os resultados existentes são movidos para o diretório de arquivamento. |
onOutputDirReady(scanDir) |
O diretório privado da análise está pronto. |
onScanStarted() |
A configuração da análise termina e a execução começa. |
onTrustedAccessStatus(status) |
O estado de Trusted Access fica disponível. |
onReconnect(attempt, maxAttempts) |
O SDK tenta novamente ligar um fluxo de análise desligado. |
onActivity(activity) |
Um comando, ferramenta, passo de raciocínio ou mensagem é atualizado. |
onProgress(progress) |
A fase da análise ou o número de ficheiros revistos muda. |
onWorkerStatus(status) |
O estado da análise preliminar ou do envio do trabalhador muda. |
onSessionEvent(session) |
Uma sessão de análise ou de trabalhador emite um evento. |
onCost(cost) |
Está disponível um custo estimado atualizado da análise. |
onWarning(warning) |
A análise comunica um aviso. |
onObserverError(observer, error) |
Outro callback do ciclo de vida da análise gera um erro. |
O estado de Trusted Access é granted, not_granted ou unknown. O acesso em falta ou
desconhecido também aciona onWarning.
onSessionEvent recebe eventos que não são ocultados e podem conter código-fonte
ou credenciais. Filtre-os antes de os enviar para registos partilhados ou outros
serviços.
Configurar o runtime e as credenciais
Transmita a configuração do runtime quando precisar de um plugin, interpretador ou definição específica do Codex:
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 aceita um diretório ou ZIP de plugin. pythonPath seleciona o
interpretador do plugin. codexOverrides intercala valores suportados na configuração
isolada do Codex. Por predefinição, as análises utilizam gpt-5.6-sol com um esforço de raciocínio extraelevado.
Defina model e model_reasoning_effort em codexOverrides para utilizar
um modelo ou esforço de raciocínio diferente. Para utilizar o Amazon
Bedrock, defina
model_provider e model em codexOverrides.
codexOverrides não pode restringir o acesso da análise ao sistema de ficheiros nem alterar a respetiva
política de aprovação. Consulte Permissões de análise
local.
Para OpenRouter ou Fireworks, forneça também a API key correspondente e uma
configuração completa do fornecedor em codexOverrides. Por exemplo, defina
OPENROUTER_API_KEY e configure o 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",
},
},
},
});Para o Fireworks, altere ambas as chaves openrouter para fireworks, defina name como
Fireworks AI, defina env_key como FIREWORKS_API_KEY, utilize
https://api.fireworks.ai/inference/v1 como base_url e selecione um modelo do Fireworks.
O cliente também expõe métodos de autenticação suportados:
| Método | Finalidade |
|---|---|
loginApiKey(apiKey) |
Autenticar o runtime isolado com uma API key. |
loginChatGPT() |
Iniciar um fluxo de início de sessão no navegador e devolver um identificador de início de sessão. |
loginChatGPTDeviceCode() |
Iniciar um fluxo de início de sessão com código de dispositivo e devolver um identificador de início de sessão. |
account() |
Devolver o estado de autenticação atual. |
logout() |
Limpar a autenticação isolada. |
Um identificador de início de sessão fornece waitForInstructions, authUrl, verificationUrl,
userCode, wait e cancel para que uma aplicação possa apresentar e concluir o
fluxo de início de sessão selecionado. O SDK pode reutilizar um início de sessão do Codex baseado em ficheiros. As API keys
são adequadas para CI e automatização no servidor.
Quando estão disponíveis uma API key e um início de sessão armazenado, o SDK utiliza a API key por predefinição. Para utilizar o seu início de sessão do ChatGPT, selecione-o para a análise:
const result = await security.run("/path/to/repository", {
auth: "chatgpt",
});Defina auth: "api-key" para exigir uma API key do ambiente. preflight aceita
a mesma opção auth.
Tratar erros de análise
Capture a classe de erro exportada que corresponde à ação que a sua aplicação pode executar:
| Erro | Significado |
|---|---|
AuthenticationRequiredError |
Uma análise requer uma credencial suportada. |
ConfigurationError |
A configuração do Codex ou uma substituição não é adequada. |
InvalidTargetError |
O repositório, caminho, modo ou alvo do Git não é adequado. |
OutputDirectoryError |
A localização de saída ou as respetivas permissões não são adequadas. |
OutputInsideProtectedRootError |
O diretório de saída encontra-se dentro do repositório ou da árvore de trabalho analisados. |
PluginPythonUnavailableError |
Não está disponível um interpretador Python utilizável. |
PluginBootstrapError |
Não foi possível iniciar o runtime do plugin. |
ScanCostLimitExceededError |
A análise excedeu o respetivo limite de custos estimado. |
IncompleteScanError |
A análise terminou antes de produzir o resultado necessário. |
ContractValidationError |
Uma análise concluída devolveu um erro de contrato estruturado. |
ScanInterruptedError |
Uma interrupção parou a análise e pode ter deixado uma saída parcial. |
Continue com o guia de início rápido da CLI, o guia de CI ou a referência da CLI.