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

# Código

> Execute JavaScript personalizado para transformar dados e aplicar lógica complexa

O nó **Código** permite que você execute JavaScript personalizado dentro do seu fluxo. É útil para operações que não podem ser realizadas com nós padrão: transformar dados, realizar cálculos, manipular texto ou integrar lógica de negócio personalizada.

## Acessando variáveis

Dentro do nó de Código você pode ler e escrever variáveis do fluxo usando objetos globais predefinidos.

### Contexto (\$context)

Variáveis que persistem apenas durante a execução atual do fluxo:

```javascript theme={null}
// Read
const name = $context.get('name')
const name = $context.get('name', 'John') // with default value

// Write
$context.set('lastOrder.status', 'delivered')
$context.set('user', { name: 'John', plan: 'gold' })
```

### Memória (\$memory)

Variáveis que persistem entre workflows, ferramentas e nós. Suportam time-to-live (TTL):

```javascript theme={null}
// Primitives (string, number, boolean) - optional TTL
$memory.set('name', 'John')
$memory.set('attempts', 3, 3600) // expires in 1 hour

// JSON - TTL required (in seconds, maximum 86,400 = 1 day)
$memory.setJson('user', { name: 'John', plan: 'gold' }, 86400)

// Files - async, TTL required (maximum 604,800 = 1 week)
await $memory.setFile('receipt', base64String, 604800, 'application/pdf')
```

#### Leitura

```javascript theme={null}
const name = $memory.get('name')
const user = $memory.getJson('user')
const url = $memory.getFile('receipt').toUrl()           // temporary URL
const base64 = await $memory.getFile('receipt').toBase64()
```

#### Exclusão

```javascript theme={null}
$memory.delete('temporary')
$memory.delete(['tmp1', 'tmp2', 'cache']) // multiple keys
```

#### Limites por tipo de dado

| Tipo        | Tamanho máximo | TTL         | TTL máximo          |
| :---------- | :------------- | :---------- | :------------------ |
| **String**  | 255 caracteres | Opcional    | —                   |
| **Number**  | 15 dígitos     | Opcional    | —                   |
| **Boolean** | —              | Opcional    | —                   |
| **JSON**    | 15 KB          | Obrigatório | 86.400s (1 dia)     |
| **File**    | 10 MB          | Obrigatório | 604.800s (1 semana) |

<Warning>
  Os métodos `$memory.setFile()`, `$memory.getFile().toBase64()` e `$memory.getFile().toRaw()` são **assíncronos**. Você deve usar `await` ao chamá-los.
</Warning>

### Migração de nós legados

1. Crie um novo nó **Code (Memory V2)**.
2. Copie e cole o script do nó legado.
3. Use os novos métodos disponíveis (`$memory.setJson`, `$memory.setFile`, etc.) se necessário.

### Usuário (\$user)

Informações sobre o contato que interage com seu fluxo:

```javascript theme={null}
const userId = $user.get('id')
const userName = $user.get('names')
```

### Mensagem (\$message)

A última mensagem enviada pelo usuário:

```javascript theme={null}
const text = $message.get('text')
const type = $message.get('type')       // TEXT, IMAGE, AUDIO, VIDEO, LOCATION, FILE
const attachmentUrl = $message.get('mediaUrl')
const lat = $message.get('lat')
const lng = $message.get('lng')
```

### Entrada/Saída ($input, $output)

Para comunicação entre ferramentas e workflows:

```javascript theme={null}
const city = $input.get('city', 'Quito')  // with default value
$output.set('data', result)
```

### Respostas HTTP

Se você salvou a resposta de um nó API:

```javascript theme={null}
let apiResponse = $context.getHttpResponse('apiResponse')
apiResponse = apiResponse.json()

$memory.set('name', apiResponse.data.user.name)
```

<Warning>
  A chave em `$context.getHttpResponse()` deve corresponder exatamente à que você configurou no campo "Salvar resposta" do nó API.
</Warning>

## Utilitários disponíveis

### Logger

Registra valores para depuração no formato chave-valor. Os logs aparecem no histórico de execução:

```javascript theme={null}
// Primitives are stored as-is
$utils.logger.log('userId', 1245)
$utils.logger.log('status', 'active')

// Objects and arrays are converted to string (truncated to 512 characters)
$utils.logger.log('orderData', { id: 1, name: 'christian' })
```

<Warning>
  Cada nó permite no máximo **10 entradas de log**. O valor de cada entrada tem um limite de **512 caracteres**.
</Warning>

### Crypto

Funções criptográficas padrão:

```javascript theme={null}
$utils.crypto.createHash('sha256')
$utils.crypto.createHmac('sha256', key)
$utils.crypto.randomBytes(32)
```

### Lodash

Utilitários para manipulação de arrays, objetos e strings:

```javascript theme={null}
$utils._.get(object, 'nested.path', defaultValue)
$utils._.uniq(array)
$utils._.chunk(array, size)
$utils._.merge(object1, object2)
```

<Tip>
  **Tipos MIME permitidos para `$memory.setFile()`:**

  | Categoria  | Tipos                                                                   |
  | :--------- | :---------------------------------------------------------------------- |
  | Texto      | `text/plain`                                                            |
  | JSON/XML   | `application/json`, `application/xml`, `text/xml`                       |
  | Imagens    | `image/jpeg`, `image/png`, `image/gif`                                  |
  | Vídeos     | `video/mp4`, `video/ogg`, `video/webm`, `video/x-msvideo`, `video/mpeg` |
  | Áudio      | `audio/mpeg`, `audio/wav`, `audio/ogg`, `audio/aac`, `audio/flac`       |
  | Documentos | `application/pdf`                                                       |
</Tip>
