> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Arquivo de licença do Devin air-gapped

> Instale, inspecione e renove o arquivo de licença offline que o Devin Desktop e a CLI air-gapped validam na inicialização, com os IDs de chave esperados e os códigos de erro LIC.

> [!NOTE]
>
> Esta documentação é destinada às implantações federais do Devin. [Voltar para a Documentação do Devin](/pt-BR/get-started/devin-intro)

Os builds air-gapped do Devin Desktop e da Devin CLI não usam login na nuvem. O acesso é controlado por um **arquivo de licença assinado**, que o produto valida de forma totalmente offline a cada inicialização. Cada licença é emitida pelo portal para um único titular da licença e consome uma licença do direito de uso air-gapped da sua equipe.

## Onde a licença fica armazenada

| | |
| - | - |
| Caminho padrão | `/etc/devin/license.devin-onprem-license` |
| Caminho padrão (Windows) | `C:\ProgramData\Devin\license.devin-onprem-license` |
| Override | `DEVIN_LICENSE_FILE=<path>` |

O agente incluído no Desktop e a CLI independente leem o mesmo arquivo. Instale-o antes da primeira inicialização; consulte [Instalação → Etapa 4](/pt-BR/federal/air-gapped/install#step-4-place-the-license-and-models-file). Usuários do Desktop também podem instalar uma licença nas configurações do Devin: o agente incluído valida o arquivo offline, não sobrescreve um arquivo pertencente a outro usuário e registra um evento de auditoria `license_installed`. No Windows, quando o arquivo de licença pertence a um administrador, um usuário padrão não consegue substituí-lo pelo Desktop (a instalação é recusada com `LIC001`), mas um administrador consegue. [Restrinja o acesso a `C:\ProgramData\Devin\`](/pt-BR/federal/air-gapped/install#windows-lock-down-the-configuration-folder) antes de colocar o arquivo.

## Emitir uma licença pelo portal

1. Faça login no portal e abra a página **Team**. A seção **Air-gapped licenses** mostra quantas licenças estão em uso, o período de direito de uso e a duração padrão das licenças.
2. Clique em **Generate license**.
3. Informe um **rótulo** (por exemplo, o nome do host ou o nome do usuário), o **e-mail do responsável** e a **duração em dias**. Por padrão, a duração corresponde ao valor padrão do seu direito de uso e é limitada tanto pelo máximo permitido quanto pelo fim do período de direito de uso. A etapa de revisão mostra a data de expiração prevista.
4. Confirme. O portal exibe **License generated** e oferece a opção **Download license file**. O arquivo baixado é o `.devin-onprem-license` assinado. Transfira-o para o host air-gapped usando o processo de mídia aprovado pela sua organização.

A tabela **Issued licenses** lista todas as licenças com o respectivo status (**Active**, **Expiring soon**, **Expired**, **Revoked**). Nessa tabela, você pode baixar novamente uma licença ativa. A revogação ou reemissão de uma licença, assim como a liberação de uma licença quando todas estiverem em uso, fica a cargo da sua equipe de suporte.

## O que o arquivo contém

O arquivo é um único JSON Web Token em formato compacto (`header.payload.signature`), assinado com EdDSA (Ed25519). O `kid` do cabeçalho identifica a chave pública usada na assinatura. Como o produto já inclui a chave pública de cada ambiente, nada é buscado no momento da validação. Claims:

| Claim | Significado |
| - | - |
| `license_id` | ID exclusivo desta licença |
| `account_id` | Sua conta |
| `seat_label` | O titular da licença, geralmente um endereço de e-mail |
| `iat` / `nbf` | Início da validade (segundos Unix) |
| `exp` | Fim da validade (segundos Unix) |
| `product` | Sempre `devin-onprem` |
| `entitlements` | Lista de strings de direitos de uso; pode estar vazia |

A validação confere a assinatura usando a chave incorporada selecionada pelo `kid`, verifica a janela `nbf`/`exp` com uma franquia de 24 horas para diferença de relógio em cada direção e checa a claim `product`.

## Inspecionar uma licença

### Verifique o ID da chave

Decodifique o cabeçalho do JWT e leia o campo `kid`. Este comando de uma linha funciona tanto no Linux quanto no macOS: ele converte base64url em base64 e adiciona o preenchimento, já que o `base64` BSD incluído no macOS trunca silenciosamente entradas sem preenchimento.

```sh theme={null}
h=$(cut -d. -f1 < /etc/devin/license.devin-onprem-license | tr '_-' '/+')
while [ $(( ${#h} % 4 )) -ne 0 ]; do h="$h="; done
printf '%s' "$h" | base64 -d | jq -r .kid
```

```text theme={null}
fedstart-key-1
```

Valores esperados:

| Ambiente do portal | `kid` esperado |
| - | - |
| Produção do FedStart (`windsurf.fedstart.com`) | `fedstart-key-1` |
| Homologação do FedStart | `fedstart-staging-key-1` |

Um `kid` diferente ou um resultado vazio indica que o arquivo não é uma licença emitida para este produto ou que foi corrompido durante a transferência.

### Verifique a licença, a conta e a data de expiração

O `devin auth status` funciona mesmo quando a licença está ausente ou é inválida, então você pode usá-lo para diagnosticar o problema:

```sh theme={null}
devin auth status
```

```text theme={null}
Air-gapped build: access is license-based.
  License file:  /etc/devin/license.devin-onprem-license
  Identity:      alice <alice@example.gov>
  Seat:          alice@example.gov
  Account:       acme
  Expires:       2027-03-01 (340 day(s) left)
```

`Identity` é a identidade local de atribuição de autoria (nome de usuário do sistema operacional mais `git config user.email`); ela consta no registro de auditoria e não depende da licença. Se o arquivo não puder ser validado, a última linha passa a ser `License:       INVALID — LIC00X: <reason>`.

A verificação `license` em `devin airgap doctor` informa a mesma licença, conta e data de expiração, e muda para `warn` quando faltam 30 dias ou menos para a expiração.

## Comportamento na inicialização e na revalidação

* A cada inicialização, a CLI valida a licença e imprime uma linha no stderr:

  ```text theme={null}
  Devin on-prem license: seat alice@example.gov (account acme), expires 2027-03-01. Local user: alice <alice@example.gov>.
  ```

  Se a licença expirar em até 30 dias, uma linha `Warning: license expires in N day(s)` é exibida logo em seguida.
* Processos de longa duração (o agente incluído no pacote do Desktop e o REPL da CLI) verificam o arquivo novamente no máximo uma vez por hora, **antes de iniciar uma nova sessão ou um novo turno**. O trabalho em andamento nunca é interrompido.
* Uma licença expirada há mais de 24 horas bloqueia novas sessões e novos turnos. No Desktop, o painel de chat exibe o erro ACP `-32019 license_invalid`; a causa específica (`LIC00X`) pode ser consultada em **View → Output → Devin ACP**.
* As falhas não ficam em cache: um arquivo renovado passa a valer no próximo turno, sem necessidade de reiniciar.
* Alguns comandos podem ser executados sem uma licença válida, para que você consiga reparar um host: `devin auth status`, `devin airgap doctor`, `devin doctor`, `devin diagnostics`, `devin models validate` e `devin version`.

## Renovar ou substituir uma licença

1. Gere uma nova licença no portal para o mesmo titular da licença (veja acima). Se a licença já estiver ocupada, peça à sua equipe de suporte que revogue a licença antiga primeiro.
2. Substitua o arquivo existente em `/etc/devin/license.devin-onprem-license` (ou no caminho definido em `DEVIN_LICENSE_FILE`) pelo novo arquivo. Mantenha o arquivo como propriedade da conta que executa o Devin ou do root, com permissão de leitura para essa conta. No Windows, o caminho padrão é `C:\ProgramData\Devin\license.devin-onprem-license`; substitua o arquivo em uma sessão com privilégios elevados.
3. Confirme:

   ```sh theme={null}
   devin auth status | grep Expires
   ```

   ```text theme={null}
     Expires:       2028-03-01 (705 day(s) left)
   ```

Não é necessário reiniciar: a próxima sessão ou o próximo turno já usará o novo arquivo.

## Códigos de erro

Todas as falhas de licença são exibidas como `LIC00X: <message>`, seguidas do caminho verificado e de como alterá-lo.

| Código | Significado | O que fazer |
| - | - | - |
| `LIC001` | Arquivo de licença ausente ou ilegível | Instale o arquivo no caminho padrão ou defina `DEVIN_LICENSE_FILE`; verifique as permissões do arquivo para o usuário que executa o Devin |
| `LIC002` | Arquivo malformado: não é um JWT EdDSA válido ou não há `kid` no cabeçalho | Baixe a licença novamente no portal; certifique-se de que o arquivo foi transferido sem alterações (sem nova linha adicionada, quebra de linha automática ou mudança de codificação) |
| `LIC003` | Falha na verificação da assinatura | O payload foi alterado após a assinatura. Baixe a licença novamente |
| `LIC004` | `kid` desconhecido (nenhuma chave pública incorporada correspondente) | Verifique o `kid` exibido acima. A licença foi emitida por outro ambiente ou seu build é anterior a uma rotação de chave; instale a versão atual |
| `LIC005` | Expirada há mais tempo que o período de carência de 24 horas | Renove a licença |
| `LIC006` | Ainda não válida (data de emissão mais de 24 horas no futuro) | Verifique o relógio do host; se estiver correto, entre em contato com sua equipe de suporte |
| `LIC007` | Claim `product` incorreta (diferente de `devin-onprem`) | O arquivo não é uma licença air-gapped do Devin. Baixe-a novamente no portal |

O catálogo completo de todos os namespaces está em [Códigos de erro](/pt-BR/federal/air-gapped/error-codes).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.