> ## 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

> Ejecuta código JavaScript personalizado para transformar datos y aplicar lógica compleja

El nodo **Código** te permite ejecutar JavaScript personalizado dentro de tu flujo. Es útil para operaciones que no se pueden lograr con los nodos estándar: transformar datos, hacer cálculos, manipular textos o integrar lógica de negocio personalizada.

## Acceso a variables

Dentro del nodo Código puedes leer y escribir variables del flujo usando objetos globales predefinidos.

### Contexto (\$context)

Variables que persisten solo durante la ejecución actual del flujo:

```javascript theme={null}
// Leer
const nombre = $context.get('nombre')
const nombre = $context.get('nombre', 'Juan') // con valor por defecto

// Escribir
$context.set('ultimoPedido.estado', 'entregado')
$context.set('usuario', { nombre: 'Juan', plan: 'gold' })
```

### Memoria (\$memory)

Variables que persisten entre workflows, tools y nodos. Soportan tiempo de vida (TTL):

```javascript theme={null}
// Primitivos (string, number, boolean) - TTL opcional
$memory.set('nombre', 'Juan')
$memory.set('intentos', 3, 3600) // expira en 1 hora

// JSON - TTL requerido (en segundos, máximo 86,400 = 1 día)
$memory.setJson('usuario', { nombre: 'Juan', plan: 'gold' }, 86400)

// Archivos - async, TTL requerido (máximo 604,800 = 1 semana)
await $memory.setFile('comprobante', base64String, 604800, 'application/pdf')
```

#### Lectura

```javascript theme={null}
const nombre = $memory.get('nombre')
const usuario = $memory.getJson('usuario')
const url = $memory.getFile('comprobante').toUrl()           // URL temporal
const base64 = await $memory.getFile('comprobante').toBase64()
```

#### Eliminación

```javascript theme={null}
$memory.delete('temporal')
$memory.delete(['tmp1', 'tmp2', 'cache']) // múltiples claves
```

#### Límites por tipo de dato

| Tipo        | Tamaño máximo  | TTL       | TTL máximo          |
| :---------- | :------------- | :-------- | :------------------ |
| **String**  | 255 caracteres | Opcional  | —                   |
| **Number**  | 15 dígitos     | Opcional  | —                   |
| **Boolean** | —              | Opcional  | —                   |
| **JSON**    | 15 KB          | Requerido | 86,400s (1 día)     |
| **File**    | 10 MB          | Requerido | 604,800s (1 semana) |

<Warning>
  Los métodos `$memory.setFile()`, `$memory.getFile().toBase64()` y `$memory.getFile().toRaw()` son **asincrónicos**. Debes usar `await` al llamarlos.
</Warning>

### Migración desde nodos legacy

1. Crea un nuevo nodo **Código (Memory V2)**.
2. Copia y pega el script del nodo legacy.
3. Usa los nuevos métodos disponibles (`$memory.setJson`, `$memory.setFile`, etc.) si lo necesitas.

### Usuario (\$user)

Información del contacto que interactúa con tu flujo:

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

### Mensaje (\$message)

El último mensaje que envió el usuario:

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

### Input/Output ($input, $output)

Para comunicación entre tools y workflows:

```javascript theme={null}
const ciudad = $input.get('ciudad', 'Quito')  // con valor por defecto
$output.set('data', resultado)
```

### Respuestas HTTP

Si guardaste la respuesta de un nodo API:

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

$memory.set('nombre', apiResponse.data.usuario.nombre)
```

<Warning>
  La llave en `$context.getHttpResponse()` debe coincidir exactamente con la que configuraste en el campo "Guardar respuesta" del nodo API.
</Warning>

## Utilidades disponibles

### Logger

Registra valores para depuración en formato clave-valor. Los logs aparecen en el historial de ejecuciones:

```javascript theme={null}
// Primitivos se almacenan tal cual
$utils.logger.log('userId', 1245)
$utils.logger.log('estado', 'activo')

// Objetos y arrays se convierten a string (truncado a 2,000 caracteres)
$utils.logger.log('orderData', { id: 1, nombre: 'cristian' })
```

<Warning>
  Cada nodo permite un máximo de **5 registros**. El valor de cada registro tiene un límite de **2,000 caracteres**.
</Warning>

### Crypto

Funciones criptográficas estándar:

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

### Lodash

Utilidades para manipular arrays, objetos y strings:

```javascript theme={null}
$utils._.get(objeto, 'ruta.anidada', valorPorDefecto)
$utils._.uniq(array)
$utils._.chunk(array, tamano)
$utils._.merge(objeto1, objeto2)
```

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

  | Categoría  | Tipos                                                                   |
  | :--------- | :---------------------------------------------------------------------- |
  | Texto      | `text/plain`                                                            |
  | JSON/XML   | `application/json`, `application/xml`, `text/xml`                       |
  | Imágenes   | `image/jpeg`, `image/png`, `image/gif`                                  |
  | Videos     | `video/mp4`, `video/ogg`, `video/webm`, `video/x-msvideo`, `video/mpeg` |
  | Audios     | `audio/mpeg`, `audio/wav`, `audio/ogg`, `audio/aac`, `audio/flac`       |
  | Documentos | `application/pdf`                                                       |
</Tip>
